C 中的链表,随机输出


#include <stdio.h>
struct list
{ 
    int data; 
    struct list *next;
}; 
struct list *start, *end; 
void add(struct list *head, struct list *list, int data); 
void delete(struct list *head, struct list *tail); 
int main(void)
{ 
    start=end=NULL; 
    add(start, end, NULL); 
    add(start, end, NULL); 
    printf("First element: %d"); 
    delete(start, end);
    return 0; 
} 
void add(struct list *head, struct list *tail, int data)
{ 
    if(tail==NULL)
    { 
        head=tail=malloc(sizeof(struct list)); 
        head->data=data; head->next=NULL; 
    } else { 
        tail->next=malloc(sizeof(struct list)); 
        tail=tail->next; 
        tail->data=data; 
        tail->next=NULL; 
    } 
}
void delete(struct list *head, struct list *tail)
{ 
    struct list *temp; 
    if(head==tail)
    {  
        free(head); 
        head=tail=NULL;
    } else { 
        temp=head->next; 
        free(head); 
        head=temp; 
    } 
}

我的目标是返回 3 的输出,但不断得到随机结果。 任何见解都非常感谢

当你想要修改headtail时,你需要传递一个指向它们的指针。

void add(struct list **head, struct list **tail, int data)
{ 
    if(*tail==NULL)
    { 
        *head = *tail = malloc(sizeof(struct list)); 
        (*head)->data = data;
        (*head)->next = NULL; 
    } else { 
        (*tail)->next = malloc(sizeof(struct list)); 
        *tail = (*tail)->next; 
        (*tail)->data = data; 
        (*tail)->next = NULL; 
    } 
}

对另一个函数执行类似操作。然后头部和尾部也会在功能之外发生变化。

该行

printf("First element: %d"); 

它需要一个整数来打印 - 提供它 - 请参阅printf的手册页

避免在 C 程序中对C++使用关键字 - 例如delete

C 函数的参数按值传递。因此,对 add() 函数中的 headtail 值所做的更改将不会反映在调用add()main()中。

而且,您似乎没有为printf()提供第二个参数,因此%d格式不会获得它将要查找的整数值。

在你的程序中,开始和结束是全局变量,所以没有必要把它作为参数传递给其他函数,因为其他方法可以直接访问它。

 //Structure to store data
 struct list
 { 
    int data; 
    struct list *next;
 }; 
 // global variables
 struct list *start, *end; 
 void add(int); 
 void delete(); 
// start of program
int main(void)
{ 
    start=end=NULL;
    add(5); 
    add(6); 
    printf("nFirst element: %d",start->data);    
    delete();
    printf("nFirst element: %d",start->data); 
 return 0; 
} 
//add node to list
void add(int data)
{ 
    if(end==NULL)
    { 
        start=end=malloc(sizeof(struct list)); 
        start->data=data; start->next=NULL; 
    } else { 
        end->next=malloc(sizeof(struct list)); 
        end=end->next; 
        end->data=data; 
        end->next=NULL; 
    } 
}
// delete node from list
void delete()
{ 
    struct list *temp; 
    if(start==end)
    {  
        free(start); 
        start=end=NULL;
     } else { 
        temp=start->next; 
        free(start); 
        start=temp; 
     } 
}
OUTPUT:
   First element: 5
   First element: 6

注意:如果你不希望你的开始和结束是全局的,那么它可以是 main 函数的局部变量。在这里,您必须使用双指针机制或返回内存地址以保留修改。

这里有许多问题。

首先,当您将指针传递给函数时,指针是按值传递的。对被调用函数中指针的任何更改都不会反映在调用函数中。若要更改调用函数中的指针指向的内容,需要传递指针到指针。因此,您的add()函数需要:

void add(struct list **head, struct list **tail, int data) { 
    if(*tail == NULL) { 
        *head = *tail = malloc(sizeof(struct list)); 
        (*head)->data = data; 
        (*head)->next = NULL; 
    } 
    else { 
        (*tail)->next = malloc(sizeof(struct list)); 
        (*tail) = (*tail)->next; 
        (*tail)->data = data; 
        (*tail)->next = NULL; 
    } 
    return;
}

您的delete()功能也需要进行类似的更改。

其次,您将 NULL 作为数据值传递给 add 函数。NULL 是一个指针;它通常定义为宏,并且可以在实现中(void*) 0。它不应用作整数。将 0 作为整数传递,而不是 NULL。

第三,你有这样的说法:

printf("First element: %d");

格式字符串具有转换说明符%d但没有与%d匹配的参数。这是未定义的行为。您到底要打印什么整数?

您期望输出3在哪里,出于什么原因?

相关内容

  • 没有找到相关文章

最新更新