鱼C论坛

 找回密码
 立即注册
查看: 1872|回复: 2

为什么我的链表遍历循环不停止??

[复制链接]
发表于 2020-4-9 12:04:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求大家帮助。遍历链表时候,程序一直循环不停止。代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>

  5. struct Node;
  6. typedef struct Node *PNode;//指向下一个struct Node用的
  7. typedef double DataType;

  8. struct Node{
  9.         DataType info;
  10.         PNode link;//next指针
  11. };

  12. typedef struct Node *LinkList; //单链表类型 的指针 //用这个构建函数  返回变量为struct Node型的指针

  13. LinkList createNullList_link(void){
  14.         /*构建空单链表*/
  15.         LinkList llist = (LinkList)malloc(sizeof(struct Node));
  16.         if(llist!=NULL) llist->link=NULL;
  17.         else printf("构建空的单链表失败\n");
  18.         return llist;
  19. }

  20. void isNullList_link(LinkList llist){
  21.         /*判断是否为空链表*/
  22.         if(llist->link==NULL){
  23.                 printf("是空链表\n");
  24.         } else{
  25.                 printf("不是空链表\n");
  26.         }
  27.        
  28. } ;

  29. PNode locate_link(LinkList llist, DataType x){
  30.         /*判断第一个元素x在单链表中存储的位置*/
  31.         PNode p;
  32.         if(llist==NULL) {
  33.                 printf("这个是空链表\n"); return NULL;
  34.         } ;
  35.        
  36.         p = llist->link;
  37.         while(p!=NULL&&p->info!=x){
  38.                 p = p->link;
  39.         };
  40.         printf("找到元素x所存储的位置\n");
  41.         return p;//返回p,p指向的是那个节点
  42. }

  43. int insertPost_Link(LinkList llist, PNode p, DataType x){
  44.         /*在p所指的节点(p已经是个节点了)后面插入新节点,经常与locate_link函数连用,意思实在p之后插入节点*/
  45.         PNode q = (PNode)malloc(sizeof(struct Node));//申请新的节点
  46.         if(q==NULL) {
  47.                 printf("新节点构建失败\n");
  48.                 return 0;
  49.         } else {
  50.                 q->info = x;
  51.                 q->link = p->link;//q的link指向了原来p的link应该指的节点
  52.                 p->link = q;//原来的p->link 指向了q 节点
  53.                 printf("新节点插入成功\n");
  54.                 return 1;
  55.         }                
  56. }

  57. /*--------------------------------------------------*/
  58. PNode locatePre_link(LinkList llist, PNode p){
  59.         /*求p所指的节点之前的节点,与函数locate_link连用*/
  60.         PNode p1;
  61.         if(llist==NULL) {
  62.                 printf("这是空的链表\n");
  63.                 return NULL;
  64.         }
  65.         p1 = llist;
  66.         while(p1!=NULL && p1->link != p){
  67.                 p1 = p1->link;
  68.         }
  69.         printf("找到了\n");
  70.         return p1;        
  71. }

  72. void insertPre_Link(LinkList llist, PNode p, DataType x){
  73.         /*在p 所指的 节点 前面插入新节点,与locatePre_link连用*/
  74.         PNode q = (PNode)malloc(sizeof(struct Node));//申请新的节点
  75.         if(q==NULL) {
  76.                 printf("新节点构建失败\n");
  77.         } else {
  78.                 q->info = x;
  79.                 q->link = p->link;//q的link指向了原来p的link应该指的节点
  80.                 p->link = q;//原来的p->link 指向了q 节点
  81.                 printf("新节点插入成功\n");
  82.         }        
  83. }
  84. /*-------------------------------------------------------------------*/

  85. int deleteV_link(LinkList llist, DataType x){
  86.         /*删除第一个元素值为x的节点*/
  87.         PNode p, q;
  88.         p = llist;
  89.         if(p==NULL){
  90.                 printf("这是个空链表\n"); return 0;
  91.         }
  92.        
  93.         while(p->link!=NULL && p->link->info!=x){
  94.                 /*p->link所指的节点的数据不等于x*/
  95.                 p = p->link;
  96.         }
  97.        
  98.         if(p->link == NULL){
  99.                 printf("不存在这个存储元素的节点\n"); return 0;
  100.         } else{
  101.                 q = p->link ;
  102.                 p->link = q->link ;
  103.                 free(q);
  104.                 printf("删除成功\n");
  105.                 return 1;
  106.         }
  107. }

  108. int deleteP_link(LinkList llist, PNode p){
  109.         /*删除p所指的节点*/

  110.         if(llist==NULL){
  111.                 printf("这是个空链表\n"); return 0;
  112.         }        
  113.        
  114.         PNode p1;
  115.         p1 =  locatePre_link(llist, p);
  116.         p1->link = p->link ;
  117.         free(p);
  118.         printf("删除成功\n");
  119.         return 1;
  120.        
  121. }

  122. void DisplayList(LinkList head){
  123.         //遍历带头结点的单链表
  124.         LinkList p = head;
  125.         if(head == NULL){
  126.                         printf("这是个空链表\n");
  127.         }
  128.         int i = 0;
  129.         for (i =0;;i++){
  130.                 if(p->info==-1) break;
  131.                 printf("%lf ",p->info );
  132.                 p = p->link;
  133.         }
  134.        
  135.         printf("\b\n");
  136. }
  137. /*--------------------------*/
  138. int main()
  139. {
  140.         LinkList head,q,tail;
  141.         q = createNullList_link();
  142.         head = q;
  143.         tail = q;
  144.         isNullList_link(q);
  145.        
  146.         double info_1 = 0;
  147.         printf("请输入第一个节点的元素:\n");
  148.         scanf("%lf", &info_1);
  149.         q->info = info_1;
  150.         head = q;
  151.         q->link = tail;
  152.         tail == NULL;
  153.         isNullList_link(q);       
  154.        
  155.         PNode t = q;
  156.         int i;
  157.         printf("请输入你要插入的元素,并以-1结束\n");
  158.         for(i = 0;; i ++ ){
  159.                 double x = 0.0;
  160.                
  161.                 scanf("%lf",&x);
  162.                 if(x==-1) break;
  163.                 int y = insertPost_Link(q,t,x);
  164.                 t = t->link;                       
  165.         }
  166.         DisplayList(head);
  167.        
  168.         printf("运行完毕,按任意键退出\n");
  169.         system("pause");
  170.         return 0;
  171. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-9 12:35:09 | 显示全部楼层
。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-9 12:55:43 | 显示全部楼层
没人回答。。。已自己解决。。。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>

  5. struct Node;
  6. typedef struct Node *PNode;//指向下一个struct Node用的
  7. typedef double DataType;

  8. struct Node{
  9.         DataType info;
  10.         PNode link;//next指针
  11. };

  12. typedef struct Node *LinkList; //单链表类型 的指针 //用这个构建函数  返回变量为struct Node型的指针

  13. LinkList createNullList_link(void){
  14.         /*构建空单链表*/
  15.         LinkList llist = (LinkList)malloc(sizeof(struct Node));
  16.         if(llist!=NULL) llist->link=NULL;
  17.         else printf("构建空的单链表失败\n");
  18.         return llist;
  19. }

  20. void isNullList_link(LinkList llist){
  21.         /*判断是否为空链表*/
  22.         if(llist->link==NULL){
  23.                 printf("是空链表\n");
  24.         } else{
  25.                 printf("不是空链表\n");
  26.         }
  27.        
  28. } ;

  29. PNode locate_link(LinkList llist, DataType x){
  30.         /*判断第一个元素x在单链表中存储的位置*/
  31.         PNode p;
  32.         if(llist==NULL) {
  33.                 printf("这个是空链表\n"); return NULL;
  34.         } ;
  35.        
  36.         p = llist->link;
  37.         while(p!=NULL&&p->info!=x){
  38.                 p = p->link;
  39.         };
  40.         printf("找到元素x所存储的位置\n");
  41.         return p;//返回p,p指向的是那个节点
  42. }

  43. int insertPost_Link(LinkList llist, PNode p, DataType x){
  44.         /*在p所指的节点(p已经是个节点了)后面插入新节点,经常与locate_link函数连用,意思实在p之后插入节点*/
  45.         PNode q = (PNode)malloc(sizeof(struct Node));//申请新的节点
  46.         if(q==NULL) {
  47.                 printf("新节点构建失败\n");
  48.                 return 0;
  49.         } else {
  50.                 q->info = x;
  51.                 q->link = p->link;//q的link指向了原来p的link应该指的节点
  52.                 p->link = q;//原来的p->link 指向了q 节点
  53.                 printf("新节点插入成功\n");
  54.                 return 1;
  55.         }                
  56. }

  57. /*--------------------------------------------------*/
  58. PNode locatePre_link(LinkList llist, PNode p){
  59.         /*求p所指的节点之前的节点,与函数locate_link连用*/
  60.         PNode p1;
  61.         if(llist==NULL) {
  62.                 printf("这是空的链表\n");
  63.                 return NULL;
  64.         }
  65.         p1 = llist;
  66.         while(p1!=NULL && p1->link != p){
  67.                 p1 = p1->link;
  68.         }
  69.         printf("找到了\n");
  70.         return p1;        
  71. }

  72. void insertPre_Link(LinkList llist, PNode p, DataType x){
  73.         /*在p 所指的 节点 前面插入新节点,与locatePre_link连用*/
  74.         PNode q = (PNode)malloc(sizeof(struct Node));//申请新的节点
  75.         if(q==NULL) {
  76.                 printf("新节点构建失败\n");
  77.         } else {
  78.                 q->info = x;
  79.                 q->link = p->link;//q的link指向了原来p的link应该指的节点
  80.                 p->link = q;//原来的p->link 指向了q 节点
  81.                 printf("新节点插入成功\n");
  82.         }        
  83. }
  84. /*-------------------------------------------------------------------*/

  85. int deleteV_link(LinkList llist, DataType x){
  86.         /*删除第一个元素值为x的节点*/
  87.         PNode p, q;
  88.         p = llist;
  89.         if(p==NULL){
  90.                 printf("这是个空链表\n"); return 0;
  91.         }
  92.        
  93.         while(p->link!=NULL && p->link->info!=x){
  94.                 /*p->link所指的节点的数据不等于x*/
  95.                 p = p->link;
  96.         }
  97.        
  98.         if(p->link == NULL){
  99.                 printf("不存在这个存储元素的节点\n"); return 0;
  100.         } else{
  101.                 q = p->link ;
  102.                 p->link = q->link ;
  103.                 free(q);
  104.                 printf("删除成功\n");
  105.                 return 1;
  106.         }
  107. }

  108. int deleteP_link(LinkList llist, PNode p){
  109.         /*删除p所指的节点*/

  110.         if(llist==NULL){
  111.                 printf("这是个空链表\n"); return 0;
  112.         }        
  113.        
  114.         PNode p1;
  115.         p1 =  locatePre_link(llist, p);
  116.         p1->link = p->link ;
  117.         free(p);
  118.         printf("删除成功\n");
  119.         return 1;
  120.        
  121. }

  122. void DisplayList(LinkList head, LinkList tail){
  123.         //遍历带头结点的单链表
  124.         LinkList p = head;
  125.         if(head == NULL){
  126.                         printf("这是个空链表\n");
  127.         }
  128.         int i = 0;
  129.         while((p->link== tail)==0){
  130.                 printf("%lf ",p->info );
  131.                 p = p->link;
  132.         }

  133.        
  134.         printf("%lf\n", p->info);
  135. }
  136. /*--------------------------*/
  137. int main()
  138. {
  139.         LinkList head,q,tail;
  140.         q = createNullList_link();
  141.         head = q;
  142.         tail = q;
  143.         isNullList_link(q);
  144.        
  145.         double info_1 = 0;
  146.         printf("请输入第一个节点的元素:\n");
  147.         scanf("%lf", &info_1);
  148.         q->info = info_1;
  149.         head = q;
  150.         q->link = tail;
  151.         tail == NULL;
  152.         isNullList_link(q);       
  153.        
  154.         PNode t = q;
  155.                
  156.         int i;
  157.         printf("请输入你要插入的元素,并以-1结束\n");
  158.         for(i = 0;; i ++ ){
  159.                 double x = 0.0;
  160.                
  161.                 scanf("%lf",&x);
  162.                 if(x==-1) {
  163.                         t->link = tail;
  164.                         break;
  165.                 }
  166.                 int y = insertPost_Link(q,t,x);
  167.                 t = locate_link(q,x);                       
  168.         }
  169.        
  170.        
  171.         DisplayList(head,tail);
  172.        
  173.         printf("运行完毕,按任意键退出\n");
  174.         system("pause");
  175.         return 0;
  176. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-5 22:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表