0
#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

4 回答 4

2

当您要修改时headtail您需要将指针传递给它们。

IE

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; 
    } 
}

对其他功能进行类似操作。那么 head 和 tail 也会在函数之外发生变化。

线

printf("First element: %d"); 

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

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

于 2013-09-12T03:59:36.753 回答
1

C 函数的参数是按值传递的。因此,您对函数head和函数中的值所做的更改不会反映在被调用tail的函数中。add()main()add()

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

于 2013-09-12T03:48:55.777 回答
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,出于什么原因?

于 2013-09-12T04:07:16.950 回答
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

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

于 2013-09-12T04:09:39.750 回答