鱼C论坛

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

关于 删除链表的

[复制链接]
发表于 2013-9-15 00:04:41 | 显示全部楼层 |阅读模式
5鱼币
编译是能过,也能输入可就是最后有个错误提示
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<malloc.h>

  4. struct Student
  5. {
  6.         char cName[20];
  7.         int iNumber;
  8.         struct Student *pNext;//指向下一个结点的指针
  9. };       

  10. int iCount; //定义全局变量

  11. struct Student *Create()
  12. {
  13.         struct Student *pHead = NULL;//初始化链表头指针为空
  14.         struct Student *pEnd;
  15.         struct Student *pNew;
  16.        
  17.         iCount=0; //初始化链表长度

  18.         pEnd = pNew = (struct Student *)malloc(sizeof(struct Student));

  19.         printf("Please first enter Name ,then number\n");

  20.         scanf("%s",&pNew->cName);
  21.         scanf("%d",&pNew->iNumber);
  22.        
  23.         while(pNew->iNumber != 0)
  24.         {
  25.                 iCount++;
  26.                 if(iCount==1)
  27.                 {
  28.                         pNew->pNext=pHead; //使得指向为空?
  29.                         pEnd = pNew;  //跟踪新加入的结点
  30.                         pHead=pNew;   //头指针指向首结点
  31.                 }
  32.                 else
  33.                 {
  34.                         pNew->pNext=NULL;
  35.                         pEnd->pNext=pNew;
  36.                         pEnd = pNew;
  37.                 }
  38.                 pNew=(struct Student*)malloc(sizeof(struct Student));
  39.                 scanf("%s",&pNew->cName);
  40.                 scanf("%d",&pNew->iNumber);
  41.         }
  42.    
  43.         free(pNew); //释放没有用到的空间
  44.        
  45.         return pHead;
  46. }

  47. void Print(struct Student *pHead)
  48. {
  49.         struct Student *pTemp; //循环所用到的临时指针
  50.         int ilndex=1;

  51.         printf("---the list has %s members:--\n",iCount);
  52.         printf("\n");

  53.         pTemp=pHead;  //使指针得到首结点的地址

  54.         while(pTemp != NULL)
  55.         {
  56.                 printf("the NO %d menber id:\n",ilndex);

  57.                 printf("the name is:%d", pTemp->cName);
  58.                 printf("the number is :%d\n", pTemp->iNumber);

  59.                 printf("\n");
  60.                 //移动临时指针到下一个结点
  61.                 pTemp=pTemp->pNext; //
  62.             ilndex++;//进行自加运算
  63.         }       
  64. }

  65. struct Student *Insert(struct Student *pHead)
  66. {
  67.         struct Student* pNew;    //指向新分配的空间

  68.         printf("--Insert member at first---\n");
  69.        
  70.         pNew=(struct Student *)malloc(sizeof(struct Student));//分配内存空间,并返回该内存空间的指针
  71.        
  72.         scanf("%s",&pNew->cName);
  73.         scanf("%d",&pNew->iNumber);
  74.        
  75.         pNew->pNext=pHead;//新节点的指针指向原来的首结点
  76.         pHead=pNew; //头指针指向首节点
  77.        
  78.         iCount++; //增加链表的首结点数
  79.         return pHead;
  80. }

  81. void Delete(struct Student* pHead,int ilndex)
  82. {
  83.         int i;   //控制循环变量
  84.         struct Student *pTemp;//表示临时指针
  85.         struct Student *pPre; //表示要删除节点前的指针
  86.        
  87.         pTemp=pHead; //得到头结点
  88.        
  89.         pPre=pTemp;
  90.        
  91.         printf("---deleteNO %d member---\n",ilndex);
  92.        
  93.         for(i=1;i<ilndex;i++)
  94.         {
  95.                 pPre=pTemp;
  96.                 pTemp=pTemp->pNext;
  97.         }
  98.         //连接删除节点两边的节点//
  99.         pPre->pNext=pTemp->pNext;
  100.        
  101.         free(pTemp);//释放掉要删除节点的内存空间

  102.         iCount--;  //减少链表中的元素个数
  103. }

  104. int main()
  105. {
  106.         struct Student *pHead; //定义头结点

  107.         pHead=Create(); //创建头结点

  108.         pHead=Insert(pHead); //插入节点

  109.         Delete(pHead,2); //删除第 2 个节点的操作
  110.        
  111.         Print(pHead); //输出链表
  112.         return 0;

  113. }
复制代码

这是结果

这是结果

最佳答案

查看完整内容

第59行格式符%s应为%d 第68行格式符%d应为%s 其中,第59行是关键错误,会引起内存报错。 --------------- 自己检查的时候先把各个子函数单独放在主函数里,可找出错误函数,再检查该函数代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-9-15 00:04:42 | 显示全部楼层
第59行格式符%s应为%d
第68行格式符%d应为%s
其中,第59行是关键错误,会引起内存报错。
---------------
自己检查的时候先把各个子函数单独放在主函数里,可找出错误函数,再检查该函数代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-9-15 23:22:31 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-9-15 23:56:36 | 显示全部楼层
这个链表我研究了,太多BUG了。排序,和插入,都有问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-9-17 14:58:03 | 显示全部楼层
给你思考下,假如说我吧34行 改成  pHead->pNext=pNew;  接下来,还需要关键性的一步,给分尼玛的。

评分

参与人数 1鱼币 +3 收起 理由
Juses + 3 学习了

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-9-18 08:50:31 | 显示全部楼层
学习一下,涨姿势
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-9-18 19:53:06 | 显示全部楼层
空手套小白狼 发表于 2013-9-15 23:56
这个链表我研究了,太多BUG了。排序,和插入,都有问题。

能详细说说吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-9-18 21:56:04 | 显示全部楼层
链表的增删改查,是基本功能,所有要基本实现。

然后在基本功能上进行一层封装,可以实现特定功能。

你的代码可移植性是0
你可以看下这个帖子,我做了一些基础的功能,有一些移植性
http://bbs.fishc.com/thread-36359-1-1.html
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-3 23:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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