2013-02-27 40 views
1

所以我有这个链表,它的工作原理,但只有当你添加一个项目的列表。这里是我的代码吧:添加到链接列表帮助? c语言只有

struct node{ 
     char key[10]; 
     char content[20]; 
     struct node *next; 
    }; 
    struct node *head=(struct node *) NULL; 
    struct node *tail=(struct node *) NULL; 

    struct node * initinode(char *key, char *content) 
    { 
    struct node *ptr; 
    ptr = (struct node *) malloc(sizeof(struct node)); 
     if(ptr == NULL)      
     return (struct node *) NULL;   
     else {         
     strcpy(ptr->key, key);   
     strcpy(ptr->content,content);      
      return ptr;       
      } 
    } 
    void printnode(struct node *ptr) 
    { 
     printf("Key ->%s\n", ptr->key); 
     printf("Contents ->%d\n", ptr->content); 
    } 
    void printlist(struct node *ptr) 
     { 
     while(ptr != NULL)   
     { 
      printnode(ptr);   
      ptr = ptr->next;    
     } 
    } 
    void add(struct node *new) 
    { 
     if(head == NULL) {  
     head = new; 
     tail=new; 
     }     
     else { 
     tail->next = new;   
     tail->next=NULL;    

      } 
    } 

所以,当我尝试添加三个项目名单,并打印它只会显示像这三个中的第一项:

 struct node *ptr; 
    char *terminal="term"; 
     char *term; 
     term=getenv("TERM"); 
     ptr=initinode(terminal, term); 
      add(ptr); 
    //----------------------- 
     char ccterm[20]; 
     char *ret, tty[40]; 
     char *currTerminal="tty"; 
    if ((ret = ttyname(STDIN_FILENO)) == NULL) 
       perror("ttyname() error"); 
    else { 
     strcpy(tty, ret); 
      } 
     ptr=initinode(currTerminal, tty); 
     add(ptr); 

    //---------------------------------- 
    char cwd[1024]; 
    char *st="date"; 
    time_t t; 
    char ti[30]; 
    time(&t); 
    char date; 
    date=t; 
    sprintf(ti,"%s", ctime(&t)); 
    ptr=initinode(st, ti); 
    add(ptr); 
    printlist(ptr); 

这使我想起我最后一个问题,当我添加这些列表中的任何一个它只输出int值,所以我怎么会打印出列表中的字符串值。我曾尝试修改我的代码为男性内容的字符串,但它从来没有工作过。任何意见是极大的赞赏,并感谢您

回答

2

在你的附加功能,你有这样的:

tail->next = new;   
tail->next=NULL; 

当它应该是

tail->next = new; 
tail = new; 
tail->next=NULL; 

另一个问题是在printnode。打印内容时,应该使用%s作为字符串。 %d用于整数。

+0

感谢它修复了int问题,但我仍然无法将正确添加到我的列表中。当我使用sprintf进行字符串表示时,它像最后一个项目一样不会添加,并且它仍然只是将一个项目添加到列表中。 – 2013-02-27 05:09:13

+0

@Noob程序员,您需要打印列表(头),而不是打印列表(ptr)来获取整个列表。 – 2013-02-27 06:17:31

+0

非常感谢你所说的一切,真的帮助了我,并为我的计划工作。 – 2013-02-27 13:59:12

0

要打印字符串,您需要修复printnode函数。

printf("Contents ->%s\n", ptr->content); 
        ^

,因为你问它专门(%d)打印int值它打印int值。

贾斯汀已经修复了你的add函数的其他问题。

+0

感谢修复了这个问题 – 2013-02-27 05:10:40

0
  1. 不要在程序投malloc()NULL

  2. 问题:

    tail->next = new; //I am new list
    tail->next=NULL; //I am nobody!

你大概的意思是:

tail->next = new; 
tail->next->next = NULL; 
tail = tail->next; 
+0

感谢它修复了int问题,但我仍然无法将正确的东西添加到我的列表中。当我使用sprintf进行字符串表示时,它像最后一个项目一样不会添加,并且它仍然只是将一个项目添加到列表中。另外如果你投了malloc()和NULL会发生什么,请解释抱歉,我是新手。 – 2013-02-27 05:10:11

+0

@Noobprogrammer在C中,如果你使用'malloc()'和'calloc'以及'realloc'和'NULL'值被认为是不好的做法。 – 2013-02-27 05:13:08

+0

@Aniket你如何在不投射的情况下使用malloc-ed的内存? – 2013-02-27 05:26:02