免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1645 | 回复: 7
打印 上一主题 下一主题

[C] 为什么运行后进行删除操作是会出现内存错误? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-29 18:17 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int x;
struct node *next;
}NODE;
void output_list(NODE*l)
{
NODE*p;
p=l;
printf("链表为:");
if (l!=NULL)
  do
  {
   printf("%3d",p->x);
   p=p->next;
  } while (p!=NULL);
}
void create_list(NODE *l)
{
NODE*p,*q;
int i,n;
printf("请输入链表长度:");
scanf("%d",&n);
printf("请输入链表各结点的元素值 :");
l=p=(NODE*)malloc(sizeof(NODE));
scanf("%d",&p->x);
q=NULL;
for (i=n-1;i>0;--i)
{
  q=(NODE*)malloc(sizeof(NODE));
  scanf("%d",&q->x);
  q->next=NULL;p->next=q;p=p->next;
}
output_list(l);
printf("\n");
}
void del_list(NODE*l ,int rc)
{
NODE*p=l,*q;
int i=0;
if (l==NULL) printf("链表为空!");
else
{
  while(p->next&&i<rc-1)
  {
   p=p->next;++i;
  }
  if(!(p->next)||i>rc-1) printf("输入删除位置错误!");
  q=p->next;
  p->next=q->next;
  free(q);
  output_list(l);
  printf("\n");
}
}
void main()
{
int rc;
NODE *l;
create_list(l);

while(1)
{
  printf("\n");
  printf("请输入要删除的元素所在链表的位序:(输入-1时结束删除操作)\n");
  fflush(stdin);         
  scanf ( "%d",&rc );
  if (rc==-1)  break;      
  del_list(l,rc);
}

}

论坛徽章:
0
2 [报告]
发表于 2009-05-29 18:23 |只看该作者
那表示你哪里的指针操作错误了

论坛徽章:
0
3 [报告]
发表于 2009-05-29 20:50 |只看该作者
具体点了,指出哪错了行么?

论坛徽章:
0
4 [报告]
发表于 2009-05-29 21:05 |只看该作者


  1. //程序设计有问题 不允许删除第一个序列的元素
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. typedef struct node{
  5.         int x;
  6.         struct node *next;
  7. }NODE;
  8. void output_list(NODE*l)
  9. {
  10.         NODE*p;
  11.         p=l;
  12.         printf("链表为:");
  13.         if (l!=NULL)
  14.                 do
  15.                 {
  16.                         printf("%3d",p->x);
  17.                         p=p->next;
  18.                 } while (p!=NULL);
  19. }
  20. void create_list(NODE *&l) //这里要改动l的值必须使用引用或者指针的指针
  21. {
  22.         NODE*p,*q;
  23.         int i,n;
  24.         printf("请输入链表长度:");
  25.         scanf("%d",&n);
  26.         printf("请输入链表各结点的元素值 :");
  27.         l=p=(NODE*)malloc(sizeof(NODE));
  28.         scanf("%d",&p->x);
  29.         p->next = NULL; //这里要记得把next置为NULL 否则输入时就出错了
  30.         q=NULL;
  31.         for (i=n-1;i>0;--i)
  32.         {
  33.                 q=(NODE*)malloc(sizeof(NODE));
  34.                 scanf("%d",&q->x);
  35.                 q->next=NULL;p->next=q;p=p->next;
  36.         }
  37.         output_list(l);
  38.         printf("\n");
  39. }
  40. void del_list(NODE*l ,int rc)
  41. {
  42.         NODE*p=l,*q;
  43.         int i=0;
  44.         if (l==NULL) printf("链表为空!");
  45.         else
  46.         {
  47.                 while(p->next&&i<rc-1)
  48.                 {
  49.                         p=p->next;++i;
  50.                 }
  51.                 if(!(p->next)||i>rc-1) { printf("输入删除位置错误!"); return;} //既然错了就不要往下走了
  52.                 q=p->next;
  53.                 p->next=q->next;
  54.                 free(q);
  55.                 output_list(l);
  56.                 printf("\n");
  57.         }
  58. }
  59. void main()
  60. {
  61.         int rc;
  62.         NODE *l;
  63.         create_list(l);
  64.        
  65.         while(1)
  66.         {
  67.                 printf("\n");
  68.                 printf("请输入要删除的元素所在链表的位序:(输入-1时结束删除操作)\n");
  69.                 fflush(stdin);         
  70.                 scanf ( "%d",&rc );
  71.                 if (rc==-1)  break;      
  72.                 del_list(l,rc);
  73.         }
  74.        
  75. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2009-05-29 21:06 |只看该作者
新手学C语言推荐还是用vc 调试方便 运行一次就能把错误位置定位出来

论坛徽章:
0
6 [报告]
发表于 2009-05-30 10:17 |只看该作者
其实调试还是挺锻炼人的

论坛徽章:
0
7 [报告]
发表于 2009-05-30 11:30 |只看该作者
谢谢了。

论坛徽章:
0
8 [报告]
发表于 2009-05-30 19:52 |只看该作者
看了半天终于找到是哪儿出错了
void create_list(NODE *l)
{
NODE*p,*q;
int i,n;
printf("请输入链表长度:");
scanf("%d",&n);
printf("请输入链表各结点的元素值 :");
l=p=(NODE*)malloc(sizeof(NODE));
scanf("%d",&p->x);
q=NULL;
for (i=n-1;i>0;--i)
{
  q=(NODE*)malloc(sizeof(NODE));
  scanf("%d",&q->x);
  q->next=NULL;p->next=q;p=p->next;
}
output_list(l);
printf("\n");
}

这个函数不能达到你预期的目的。
你是想用这个函数返回分配链表首地址是吧,可是呢
  1. void create_list(NODE *l)
复制代码

中的型参不能返回地址。
可以修改成
  1. void create_list(NODE **l)
复制代码

然后
  1. {
  2. NODE*p,*q;
  3. int i,n;
  4. printf("请输入链表长度:");
  5. scanf("%d",&n);
  6. printf("请输入链表各结点的元素值 :");
  7. /*
  8. l=p=(NODE*)malloc(sizeof(NODE));
  9. */
  10. *l=p=(NODE*)malloc(sizeof(NODE));/*这个地方改过*/
  11. scanf("%d",&p->x);
  12. q=NULL;
  13. for (i=n-1;i>0;--i)
  14. {
  15.   q=(NODE*)malloc(sizeof(NODE));
  16.   scanf("%d",&q->x);
  17.   q->next=NULL;p->next=q;p=p->next;
  18. }
  19. /*
  20. output_list(l);
  21. */
  22. output_list(*l);/*这个地方也改动了一下*/
  23. printf("\n");
  24. }
复制代码

或者这个函数返回一个指针
那就这样写啦

  1. NODE * create_list(void)
  2. {
  3. /*
  4. NODE*p,*q;
  5. */
  6. NODE*p,*q,*l;
  7. int i,n;
  8. printf("请输入链表长度:");
  9. scanf("%d",&n);
  10. printf("请输入链表各结点的元素值 :");
  11. l=p=(NODE*)malloc(sizeof(NODE));
  12. scanf("%d",&p->x);
  13. q=NULL;
  14. for (i=n-1;i>0;--i)
  15. {
  16.   q=(NODE*)malloc(sizeof(NODE));
  17.   scanf("%d",&q->x);
  18.   q->next=NULL;p->next=q;p=p->next;
  19. }
  20. output_list(l);
  21. printf("\n");
  22. return l;
  23. }
复制代码

不过改动后主函数中要作相应的改动
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP