2012-03-31 63 views
0

//美好的一天。这只是我的源代码的一部分。我的主要困境是print_list函数只打印链接列表中用户的第一个输入。我似乎无法指出这个问题,因为这个功能的逻辑似乎是正确的。 insert_list函数似乎也可以正常工作,但我并不确定。print_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]='\0'; 
      } 
    } 
    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; 
} 

// this inserts在列表中的节点

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] %s\n",i ,current->name); 
      printf("Birth Date: %d/%d/%d\n", 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 FORM\n"); 
     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; 

} 

//此代码已准备好进行编译

回答

1

我不明白,你打算通过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; 
} 
+0

是的,我用它作为前一个节点。我尝试用你的替换我的插入列表代码,但它仍然只打印其中一个输入。 – user123456098 2012-03-31 12:31:58

+0

好吧,我想你也必须修改调用代码。顺便说一句,这是印刷,仍然是第一个或最后一个? – Matthias 2012-03-31 13:19:29

+0

我很抱歉,你的代码工作正常,我正在编译错误的程序:)))谢谢你,上帝保佑! :D – user123456098 2012-03-31 13:24:06

1

你确定你粘贴了你的实际源代码吗? 在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参数的用途

打印功能对我来说似乎是合法的。尝试使用-Wall -Wextra -Werror进行编译以进行额外的错误检测。 `

+0

是我做的,但那里的错误没有解决打印功能困境 – user123456098 2012-03-31 12:19:57

+0

好,那create_node(data)好像是坏的调用,我认为下面的代码从@Matthias解决了插入问题。尝试使用@Matthias函数与'List = insert_list(List,create_node());' – 2012-03-31 12:29:36

+0

谢谢你告诉我关于create_node(data)是一个糟糕的调用。但我尝试了两种建议,但打印功能仍然只打印一个输出 – user123456098 2012-03-31 12:37:43

1

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

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

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

+0

嗨,我已经拿出主数据参数,因为另一个人说,它没有任何目的作为创建节点功能它自己创建自己的节点数据。 – user123456098 2012-03-31 12:50:46