user-0 提问: 初学链表，不知道错误在哪里

回复:
user: user-1
content: 楼主你的代码中，之所以输出的内容不是你输入的全部内容，是因为你在创建链表的时候，没有连接起来，从head指向的节点后出现了断层，  if (head == NULL)         {             p2=head = p1;         }         else         {             while (p2 != NULL)             {                 p2 = p2->p;             }             p2 = p1;         } 你的问题就出现在那块，致使head只指向了一个节点 因此在输出时，只会显示一个ID，可将代码改为  void _chain(chain* &pChain)     {           chain *pp=new chain;         pChain=pp;         cin>>pp->ID;         pp->p=NULL;         while(pp->ID!=0)             {             pp->p=new chain;             if(pp->p!=NULL)                 {                 pp=pp->p;                 cin>>pp->ID;                 pp->p=NULL;                 }             }         }

user: user-0
content: 引用 5 楼 lming_08 的回复:while (0!=p1->ID)     {         p1 = (chain*)malloc(length);         if (p1 == NULL)         {             printf("apply for the new chain fail");             exit(1);         }         if (head == NULL)         {             p2=head = p1;         }         else         {             while (p2-p != NULL)             {                 p2 = p2->p;             }             p2->p = p1;         }         p1->p = NULL;         scanf_s("%d", &p1->ID);     } 你的这个 while (p2-p != NULL)       {           p2 = p2->p;       }           p2->p = p1; 跟我这个while (p2 != NULL)             {                 p2 = p2->p;             }             p2 = p1; 作用一样啊，没什么区别，为什么你的没有错误，我的错了？

user: user-2
content: while (0!=p1->ID)     {         p1 = (chain*)malloc(length);         if (p1 == NULL)         {             printf("apply for the new chain fail");             exit(1);         }         if (head == NULL)         {             p2=head = p1;         }         else         {             while (p2-p != NULL)             {                 p2 = p2->p;             }             p2->p = p1;         }         p1->p = NULL;         scanf_s("%d", &p1->ID);     }

user: user-0
content: 引用 3 楼 logiciel 的回复:可如下修改: #include"iostream" struct chain {   long ID;   chain* p; }; #define length sizeof(chain) chain* _chain(chain* head); void _printf(chain* head); void main() {   chain* head=NULL;   printf("when the data you input is 0,the end!");   head=_chain(head);   _printf(head);  } chain* _chain(chain* head) {    chain *p1=NULL, *p2=head;   p1 = (chain*)malloc(length);   p1->ID = 10;   while (0!=p1->ID)   {     p1 = (chain*)malloc(length);     if (p1 == NULL)     {       printf("apply for the new chain fail");       exit(1);     }     if (head == NULL)     {       p2=head = p1;     }     else     {       p2->p = p1;//加       /*删       while (p2 != NULL)       {         p2 = p2->p;       }*/       p2 = p1;     }     p1->p = NULL;     scanf_s("%d", &p1->ID);   }    return head; } void _printf(chain* head) {   printf("\n");   while (NULL!=head)   {     printf("%d    ", head->ID);     head = head->p;   } } 有错误，提示：错误	1	error LNK2019: 无法解析的外部符号 _main，该符号在函数 ___tmainCRTStartup 中被引用。这是什么问题

user: user-3
content: 可如下修改: #include"iostream" struct chain {   long ID;   chain* p; }; #define length sizeof(chain) chain* _chain(chain* head); void _printf(chain* head); void main() {   chain* head=NULL;   printf("when the data you input is 0,the end!");   head=_chain(head);   _printf(head);  } chain* _chain(chain* head) {    chain *p1=NULL, *p2=head;   p1 = (chain*)malloc(length);   p1->ID = 10;   while (0!=p1->ID)   {     p1 = (chain*)malloc(length);     if (p1 == NULL)     {       printf("apply for the new chain fail");       exit(1);     }     if (head == NULL)     {       p2=head = p1;     }     else     {       p2->p = p1;//加       /*删       while (p2 != NULL)       {         p2 = p2->p;       }*/       p2 = p1;     }     p1->p = NULL;     scanf_s("%d", &p1->ID);   }    return head; } void _printf(chain* head) {   printf("\n");   while (NULL!=head)   {     printf("%d    ", head->ID);     head = head->p;   } }

user: user-4
content: 你在看看代码吧，你写代码的时候逻辑思路不清晰，所以你都不知道写的是什么

user: user-0
content: 大家帮帮我

user: user-5
content: 楼主的逻辑好混乱啊， 链表的建立 基本上就是 “头插法” 和 “尾插法”，楼主的大概是想“尾插法”建立不带头结点的链表。 以下代码仅供参考。 #include <iostream> struct chain {     long ID;     chain* p; }; #define length sizeof(chain) chain* _chain(chain* head); void _printf(chain* head); void main() {     chain* head=NULL;     printf("when the data you input is 0,the end!");     head=_chain(head);     _printf(head); } chain* _chain(chain* _head) //尾插法建立链表,不带头结点的链表 {     chain *head ,*tail,*tmp;     head = (chain*)malloc(length);     tail = head ;     tail->p = NULL;     int tmp_id;     while (1)     {         scanf_s("%d", &tmp_id);         if(tmp_id == 0 )break;         tmp = (chain*)malloc(length);         if (tmp == NULL)         {             printf("apply for the new chain fail");             exit(1);         }         tmp->p = NULL;         tmp->ID = tmp_id;         tail->p = tmp ;         tail=tmp;     }     _head = head->p;     free(head);//防止内存泄露，删除没有值的头结点     return _head; } void _printf(chain* head) {     printf("\n");     while (NULL!=head)     {         printf("%d    ", head->ID);         head = head->p;     } }

user: user-2
content: 引用 6 楼 u013497965 的回复:[quote=引用 5 楼 lming_08 的回复:] while (0!=p1->ID)     {         p1 = (chain*)malloc(length);         if (p1 == NULL)         {             printf("apply for the new chain fail");             exit(1);         }         if (head == NULL)         {             p2=head = p1;         }         else         {             while (p2-p != NULL)             {                 p2 = p2->p;             }             p2->p = p1;         }         p1->p = NULL;         scanf_s("%d", &p1->ID);     } 你的这个 while (p2-p != NULL)       {           p2 = p2->p;       }           p2->p = p1; 跟我这个while (p2 != NULL)             {                 p2 = p2->p;             }             p2 = p1; 作用一样啊，没什么区别，为什么你的没有错误，我的错了？[/quote] 我的那个p2是链表最后一个元素，然后再把新元素p1挂在p2后面，而你的那个p2则是最后一个元素的下一个，其值为NULL；你画下图就知道了