C中的链接列表,随机输出?

时间:2013-09-12 03:44:42

标签: c linked-list

#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的输出,但不断获得随机结果。非常感谢任何见解

4 个答案:

答案 0 :(得分:2)

如果你想修改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

答案 1 :(得分:1)

C函数的参数按值传递。因此,您对head函数中tailadd()的值所做的更改不会反映在调用main()的{​​{1}}中。

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

答案 2 :(得分:1)

这里有很多问题。

首先,当您将指针传递给函数时,指针将按值传递。对被调用函数中指针的任何更改都不会反映在调用函数中。要更改调用函数中指针所指向的内容,需要传递指针指针。所以你的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在哪里?出于什么原因?

答案 3 :(得分:1)

在你的程序中 start和end是全局变量,所以不需要将它作为参数传递给其他函数,因为其他方法可以直接访问它。

 //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

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