鱼C论坛

 找回密码
 立即注册
查看: 4078|回复: 7

求大神看看这段代码哪里有问题,为什么出不来链表的长度还有中间元素呢?

[复制链接]
发表于 2017-2-9 21:04:49 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<iostream.h>
  2. #include<stdlib.h>
  3. #include<stdio.h>
  4. #include<time.h>

  5. #define OK 1
  6. #define ERROR 0
  7. #define TRUE 1
  8. #define FALSE 0
  9. #define OVERFLOW -2

  10. typedef int Status;
  11. typedef int ElemType;

  12. typedef struct LNode
  13. {
  14.         ElemType data;
  15.         struct LNode *next;

  16. }LNode,*LinkList;

  17. //函数原型说明
  18. Status InitList(LinkList &L);
  19. void CreateListTail(LinkList &L,int n);
  20. Status GetElem(LinkList L,int i,ElemType &e);
  21. int printf(LinkList L);
  22. Status GetMidNode(LinkList L,ElemType &e);
  23. int ListLength(LinkList L);




  24. Status InitList(LinkList &L)  //创造一个空的单链表

  25. {
  26.         L=(LinkList)malloc(sizeof(LNode));
  27.         if(!L)
  28.                 exit(OVERFLOW);
  29.         L->next=NULL;
  30.         return OK;

  31. }//InitList
  32. void CreateListTail(LinkList &L,int n) //按照尾插法随机插入n个元素
  33. {
  34.         LinkList p,r;
  35.         int i;
  36.         srand(time(0));
  37.         L=(LinkList)malloc(sizeof(LNode));
  38.         r=L;
  39.         for(i=1;i<=n;i++)
  40.         {
  41.                 p=(LinkList)malloc(sizeof(LNode));
  42.                 p->data=rand()%100+1;
  43.                 r->next=p;
  44.                 r=p;
  45.         }
  46.         r->next=NULL;

  47. }
  48. int ListLength(LinkList L)  //单链表的长度
  49. {
  50.         int i=0;
  51.         LinkList p=L->next;
  52.         while(p)
  53.         {
  54.                 p=p->next;
  55.                 i++;
  56.         }
  57.         return i;
  58. }
  59. Status GetElem(LinkList L,int i,ElemType &e) //返回第i个元素
  60. {
  61.         if(!L)
  62.                 return ERROR;
  63.         LinkList p;
  64.         int j;
  65.         p=L->next;
  66.        
  67.         while(p&&j<i)
  68.         {

  69.                 p=p->next;
  70.                 j++;
  71.         }
  72.         if(!p||j>i)
  73.                 return ERROR;
  74.         e=p->data;
  75.         return OK;

  76. }//GetElem


  77. int printf(LinkList L)  //输出单链表的元素
  78. {
  79.         if(!L)
  80.                 return ERROR;
  81.         LinkList p;
  82.         p=L->next;
  83.         while(p!=NULL)
  84.         {
  85.                 printf("%d",p->data);
  86.                 p=p->next;
  87.         }
  88.         return OK;
  89. }//output

  90. Status GetMidNode(LinkList L,ElemType &e)//查找中间元素
  91. {
  92.         if(!L)
  93.                 return ERROR;
  94.         LinkList mid,search;
  95.         mid=search=L->next;
  96.         while(search->next->next!=NULL)
  97.         {
  98.                 mid=mid->next;
  99.                 search=search->next->next;
  100.         }
  101.         e=mid->data;
  102.         return OK;

  103. }
  104. void main()
  105. {
  106.         LinkList L ;
  107.         int i,n=6;
  108.         int s;
  109.         ElemType e;
  110.         InitList(L);
  111.         cout<<"请输入您选择的项目:"<<"1.创建链表\n"<<"2.查看链表\n"<<"3.链表长度\n"<<"4.中间元素\n"<<"0.退出\n";
  112.         while(s!='0')
  113.         {

  114.      
  115.     cin>>s;
  116.         switch(s)
  117.         {
  118.         case 1: CreateListTail(L,n); break;
  119.         case 2: printf(L); break;
  120.         case 3: ListLength(L); break;
  121.         case 4: GetMidNode(L,e); break;
  122.         case 0: exit(0);break;
  123.         }
  124.         }
  125.        
  126. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-10 04:37:41 | 显示全部楼层
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确
初始化链表的函数应该如下
  1. Status InitList(LinkList *L)  //注意传参的是 LinkList *
  2. {
  3.     *L=(LinkList)malloc(sizeof(LNode));
  4.     if(!L)
  5.                 exit(OVERFLOW);
  6.     (*L)->next=NULL;
  7.     return OK;

  8. }
复制代码


接下来是你的创建链表的函数。
函数里,你直接把头结点给掉了!这可不行,因为你后面的相关操作都是假设有头结点的。所以代码应这样写。
  1. void CreateListTail(LinkList *L,int n) //按照尾插法随机插入n个元素
  2. {
  3.     LinkList p,r;
  4.     int i;
  5.     srand(time(0));
  6.     (*L)->next=(LinkList)malloc(sizeof(LNode));        //这里应该是*L的next
  7.     r=(*L)->next;
  8.     for(i=1;i<=n;i++)
  9.     {
  10.             p=(LinkList)malloc(sizeof(LNode));
  11.             p->data=rand()%100+1;
  12.             r->next=p;
  13.             r=p;
  14.     }
  15.     r->next=NULL;
  16. }
复制代码


最后就是你说的出不来链表的长度还有中间元素。
因为你根本就没有输出!

最后,加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

 楼主| 发表于 2017-2-9 21:05:21 | 显示全部楼层
我用的编译器是VC++6.0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-11 20:18:47 | 显示全部楼层
gascd 发表于 2017-2-10 04:37
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下

*L是什么意思呢   为啥&L不行呢,我们学的是用&L啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-11 20:45:26 | 显示全部楼层
gascd 发表于 2017-2-10 04:37
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下

error LNK2001: unresolved external symbol "void __cdecl CreateListTail(struct LNode * &,int)" (?CreateListTail@@YAXAAPAULNode@@H@Z)  这是啥意思呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-11 22:34:10 | 显示全部楼层
会飞的鱼. 发表于 2017-2-11 20:18
*L是什么意思呢   为啥&L不行呢,我们学的是用&L啊。

建议重修C语言指针那一章。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 17:11:04 | 显示全部楼层
gascd 发表于 2017-2-10 04:37
兄台!我秉着照顾新人的态度,看了你的代码。
首先,你初始化链表就不正确。
初始化链表的函数应该如下

用&也可以,他只是没有输出而已。
在遍历单链表和求中间长度那段代码最后加一个输出就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 17:11:40 | 显示全部楼层
gascd 发表于 2017-2-11 22:34
建议重修C语言指针那一章。

&L可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-23 21:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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