了解C中的链接列表

时间:2017-04-26 17:31:50

标签: c linked-list

我最近开始学习链接列表,我想知道关于我的代码的两件事:

  1. 为什么程序会崩溃?

  2. 为什么在最后用换行符\n键入每个成员?

  3. 这是我的代码。我所要做的就是添加一个成员并打印出来。

    struct node
    {
        char* day;
        char* month;
        char* year;
        struct node* next;
    };
    typedef struct node node;
    
    void print(node* head){
        node* temp=head;
        while(temp != NULL){
        printf("%s %s %s",temp->day,temp->month,temp->year);
        temp=temp->next;
        }
    }
    
    node* add(node* head)
    {
        node * new_node;
        int n;
        char temp[25];
        new_node = malloc(sizeof(node));
    
        fgets(temp,sizeof(temp),stdin);
        n=strlen(temp);
        new_node->day=malloc(n+1);
        strcpy(new_node->day,temp);
    
        fgets(temp,sizeof(temp),stdin);
        n=strlen(temp);
        new_node->month=malloc(n+1);
        strcpy(new_node->month,temp);
    
        fgets(temp,sizeof(temp),stdin);
        n=strlen(temp);
        new_node->year=malloc(n+1);
        strcpy(new_node->year,temp);
    
        new_node->next=head;
        return new_node;
    }
    
    int main(void)
    {
        node* head=NULL;
        head=malloc(sizeof(node));
        if (head == NULL)
        {
            return 1;
        }
        head=add(head); 
        print(head);
        return 100;
    }
    

    任何人都可以指出我做错了什么以及我能做得更好吗?

2 个答案:

答案 0 :(得分:2)

当你做

ptr = malloc(sizeof(node)); 

已分配内存但未初始化。这将导致节点结构的下一个指针指向未定义的内容。然后,当您在打印功能中使用它时,程序崩溃。
放一个

memset(ptr, 0, sizeof(node)) 

在malloc之后或者显式地将下一个指针初始化为NULL。

答案 1 :(得分:0)

我将您的代码更改为:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

struct node
{
    char* day;
    char* month;
    char* year;
    struct node* next;
};
typedef struct node node;

void print(node *head){
    node *temp = head;

    while(temp){
        printf("day:%s\nmonth:%s\nyear:%s\n",temp->day,temp->month,temp->year);
        temp=temp->next;
    }

}
node* add(node* head)
{
    node * new_node;
    int n;
    char temp[25];
    new_node = malloc(sizeof(node));
    printf("day:\n");
    fgets(temp,sizeof(temp),stdin);
    n=strlen(temp);
    new_node->day=malloc(n+1);
    strcpy(new_node->day,temp);

    printf("Month:\n");
    fgets(temp,sizeof(temp),stdin);
    n=strlen(temp);
    new_node->month=malloc(n+1);
    strcpy(new_node->month,temp);
    printf("Year:\n");
    fgets(temp,sizeof(temp),stdin);
    n=strlen(temp);
    new_node->year=malloc(n+1);
    strcpy(new_node->year,temp);

   /// new_node->next=head;///

    printf("\n\n\n");
    //printf("%s%s%s \n",new_node->day,new_node->month,new_node->year);

    return new_node;
}
int main(int argc,char* argv[])
{

    node* head=NULL;
    head=malloc(sizeof(node));
    if (head == NULL)
    {
        printf("NULL\n");///cant allocate memory
    }
    printf("this\n");
    head=add(head); 
    print(head);
    return 100;
}