c-print_list函数只打印链接列表中用户的第一个输入



//祝您愉快。这只是我源代码的一部分。我的主要困境是print_list函数只打印链接列表中用户的第一个输入。我似乎无法指出这个问题,因为函数的逻辑似乎是正确的。insert_list函数似乎也很好用,但我不太确定。

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

//这是节点

typedef struct node
{
        char name[61];
        int month;
        int day;
        int year;
        struct node *next;
}node;

//这是列表

typedef struct list
{
        node *head;
        node *tail;
}list;

//这通过接受用户的输入来创建节点,并将其放入节点

node *create_node()
{
        int x;
        node *data = (node*) malloc(sizeof(node));
        printf("Name: ");
        fgets(data->name, 61, stdin);
        printf("Birthdate (mm/dd/yyyy): ");
        scanf("%d%*[/]%d%*[/]%d", &data->month, &data->day, &data->year);
        getchar();
        if ((data->month)==0||(data->month)>=13||(data->day)<=0||(data->day)>=32||(data->year)<=1977||(data->year)>=3001)
        {
                while ((data->month)==0||(data->month)>=13||(data->day)<=0||(data->day)>=32||(data->year)<=1977||(data->year)>=3001)
                {
                        printf("Invalid Input.n");
                        printf("Please Enter a Valid Birthdate(mm/dd/yyyy): n");
                        scanf("%d%*[/]%d%*[/]%d", &data->month, &data->day, &data->year);
                        getchar();
                }
        }
        printf("******************************************************************n");
        for (x=0; x<=strlen(data->name); x++)
        {
            if (data->name[x]=='n')
            {
                    data->name[x]='';
            }
    }
    printf("Birthday reminder for %s is added.n", data->name);
    return data;
}

list *create_list(list *plist)
{
        plist->head = NULL;
        plist->tail = NULL;
        return plist;
}

//这将在列表中插入节点

list *insert_list(list *plist, node *pnode, node *new_node)
{
    if(plist->head==NULL)
    {
            plist->head=new_node;
            new_node->next=NULL;
    }
    else
    {
            new_node->next = NULL;
            pnode->next = new_node;
            plist->tail = new_node;
    }
    return plist;
}

//这将打印列表

list *print_list(list *plist)
{
        node *current = plist->head;
        int i;
        for(i=1;current!=NULL;i++)
        {    
            printf("[%d] %sn",i ,current->name);
            printf("Birth Date: %d/%d/%dn", current->month, current->day, current->year);
            current=current->next;
    }
}

//这将取消分配列表

list *free_list(list *List)
{
    node *current = List->head;
    node *temp = NULL;
    while(current != NULL)
    {
            temp = current;
            current = current->next;
            free(temp);
    }
    List->head = NULL;
    List->tail = NULL;
}

//这是主要的

int main(void)
{
        list* List = (list*) malloc(sizeof(list));
        List = create_list(List);
        char x;
        node *data = (node *) malloc(sizeof(node));
        printf("******************************************************************n");
        printf("                    ADD BIRTHDAY REMINDER FORMn");
        printf("******************************************************************n");
        List = insert_list(List, data, create_node(data));
        printf("Would you like to add another(y/n)?n");
        scanf("%c", &x);
        if (x=='y')
        {
                while (x=='y')
                {
                        if (x=='y')
                        {
                                getchar();
                            printf("******************************************************************n");
                                node *data = (node *) malloc(sizeof(node));
                                List = insert_list(List, data, create_node(data));
                                printf("Would you like to add another(y/n)?n");
                                scanf("%c", &x);
                        }
                }
        }
    print_list(List);
    free(List);
    return 0;
}

//该代码已准备好编译

我不明白,pnodeinsert_list中的意图是什么,我想,这是错误的。可能,您的意思类似于上一个节点。但是,尾部已经是前一个节点了。此外,您在那里使用一个空节点,甚至为create_node中的节点分配内存。也许,以下代码更合适:

list *insert_list(list *plist, node *new_node)
{
    if(plist->head==NULL)
    {
            plist->head=new_node;
            plist->tail=new_node;
            new_node->next=NULL;
    }
    else
    {
            new_node->next = NULL;
            plist->tail->next = new_node;
            plist->tail = new_node;
    }
    return plist;
}

您确定粘贴了实际的源代码吗?在List = insert_list(List, data, create_node(data));中,您调用create_node(data),但函数node *create_node()的参数为零。我不理解`list*insert_list(list*plist,node*pnode,node*new_node)中node *pnode参数的用途

print函数对我来说似乎是合法的。试着用-Wall-Wextra-Werror编译以进行额外的错误检测。`

我不明白为什么insert_list需要第二个参数pnode。如果你只想打印列表中的所有元素,我认为以下修改可以解决你的问题:

首先,在insert_list的第一个if子句中添加一行plist->tail=new_node。其次,将insert_list的第二个自变量从data更改为main中的List->tail

还有一件不重要的事我想指出。你真的需要main中的条件if (x == 'y)吗?我不知道它为什么在那里。

相关内容

  • 没有找到相关文章

最新更新