首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

有个c语言有关问题,了

2012-04-05 
有个c语言问题,请教大家了。下面这段代码,编译没有错误,可运行到一半,就跳出异常,结束执行了,这是为什么啊?

有个c语言问题,请教大家了。
下面这段代码,编译没有错误,可运行到一半,就跳出异常,结束执行了,这是为什么啊?我后来用断点分析了一下是下面这段代码中的加粗有颜色的那几句有问题:
Status DeleteList()
{
int i=0,j=0;
struct Lnode *p,*q,*t;
p=LinkList;
printf("请输入删除学生的位置\n");
scanf("%d",&i);
while(p||j<i-2)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)return error;
q=p->next;
p->next=q->next;
t=LinkList;
while(t!=null)
{
printf("姓名为:%s,学号为:%d,成绩为:%d\n",t->name,t->num,t->grade);
t=t->next;
}
free(q);
free(t);
free(p);
return OK;
}
可我看不出来,请教大家了,给我提提意见?
下面是完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedef int Status;
#define OK 1
#define error 0
#define null 0
struct Lnode
{
char name[3];
int num;
int grade;
struct Lnode *next;
}lnode,*LinkList;
Status InitList()
{
struct Lnode *p1,*p2;
int i=0;
LinkList=p1=p2=(struct Lnode *)malloc(sizeof(struct Lnode));
if(!LinkList)exit(1);
for(i=0;i<10;i++)
{
printf("请输入学生的姓名,学号,和成绩:\n");
scanf("%s %d %d",p1->name,&p1->num,&p1->grade);
p2->next=p1;
p2=p1;
p1=(struct Lnode *)malloc(sizeof(struct Lnode));
}
p2->next=null;
return OK;
}
Status InsertList()
{
int i=0,j=0;
struct Lnode *p,*q,*k;
p=LinkList;
char Name[3];
int Num;
int Grade;
printf("请输入插入学生的姓名,学号,成绩\n");
scanf("%s %d %d",Name,&Num,&Grade);
printf("请输入插入的位置\n");
scanf("%d",&i);
while(p&&j<i-2)
{
p=p->next;
++j;
}
if(!p||j>i-1)return error;
q=(struct Lnode *)malloc(sizeof(struct Lnode));
strcpy(q->name,Name);
q->num=Num;
q->grade=Grade;
q->next=p->next;
p->next=q;
k=LinkList;
while(k!=null)
{
printf("姓名为:%s,学号为:%d,成绩为:%d\n",k->name,k->num,k->grade);
k=k->next;
}
free(k);
free(p);
free(q);
return OK;
}
Status DeleteList()
{
int i=0,j=0;
struct Lnode *p,*q,*t;
p=LinkList;
printf("请输入删除学生的位置\n");
scanf("%d",&i);
while(p||j<i-2)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)return error;
q=p->next;
p->next=q->next;
t=LinkList;
while(t!=null)
{
printf("姓名为:%s,学号为:%d,成绩为:%d\n",t->name,t->num,t->grade);
t=t->next;
}
free(q);
free(t);
free(p);
return OK;
}
Status LookList()
{
int i=0,j=1;
struct Lnode *p;
p=LinkList;
printf("请输入要查找学生的位置\n");
scanf("%d",&i);
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)return error;
printf("要查找的学生姓名为:%s 学号:%d成绩:%d",p->name,p->num,p->grade);
return OK;
}
void main()
{
char chooise;
printf("请选择对链表的操作,操作菜单如下:\n");
printf("***********************************\n");
printf("初始化链表(C)\n");
printf("链表中插入元素(I)\n");
printf("链表中删除元素(D)\n");
printf("链表中查找元素(L)\n");
printf("退出系统(E)\n");
printf("***********************************\n");
scanf("%c",&chooise);
switch(chooise)
{
case 'C':InitList();
case 'I':InsertList();
case 'D':DeleteList();
case 'L':LookList();
case 'E':exit(0);break;
default:printf("选择错误");

}



}


------解决方案--------------------


在你的 DeleteList 函数里,有比较严重的几个问题,如下:
1、查找删除位置的时候,你的循环条件是 while(p||j<i-2),这个会导致 p 不指向空不罢休的
2、函数结束前的 free(t); 及 free(p); 究竟想干啥?和上次说的道理一样的(free(q)是对的,q指向的是要删除的节点)
3、你的链表是无头节点链表,那么删除第一个节点的时候必须做特殊处理,你的代码里面没有做,可想而知当其它问题全解决了后,这个问题将会暴露出来

另外,你初始化链表、插入数据、删除数据、查找数据,然后就。。。退出了?链表上分配的内存也不释放了?

上述问题你自己仔细琢磨下,建议你把 指针、单链表、堆、动态分配内存 相关的资料再好好复习复习

下面这个链接里面有我写的一个链表,后面的帖子有详细注释版本,你有兴趣的话就参考一下吧
http://topic.csdn.net/u/20120228/19/0859e73b-68b0-41c9-909c-8f0643bde5d1.html

另外,你愿意的话,就结贴吧,我不想再在这个贴上花更多精力了,抱歉
 

热点排行