刚学单链表,但是程序每到进行查找操作和排序操作,程序就闪退
编译的时候也没有报错,深夜求助,下面是测试程序的一些片段,单链表初始化和其他操作如插入、删除、输出等都没什么问题,就是一到下面两种操作就闪退了,两个操作函数都是void型的
Linklist L;
ElemType *e;
case 9:printf("请输入元素的位置\n");scanf("%d",&flag);GetElem(L,flag,e);break;//找到flag位置的数据并print出来
case 14:LinkSort(&L);break;//对单链表中的数据排序
下面是查找操作的函数
void GetElem(Linklist L,int i,Elemtype *e)
{
if (L==NULL)
{
printf("单链表不存在\n");
}
else
{
if (L->next==NULL)
{
printf("单链表为空\n");
}//前提判断
else{
int length;
length=ListLength(L);
if (i>length||i<0)
{
printf("输入错误\n");
}//判断输入合法性
else
{
int j=0;
for (j = 0; j < i; j++)
{
(*e)=(L->next)->data;
L=L->next;
}//循环i次,将L->next指向第i个节点,并传值给*e
printf("第%d个位置的数据为%d\n",i,*e);
}
}
}
}
下面是排序操作的函数,排序操作的我的思想是,创建一个新单链表,然后将传入的单链表的每个节点的数据先与新单链表中的数据进行比较,从小到大确定位置,然后再用插入操作,将每个数据插入新的单链表中
void LinkSort(Linklist *L)
{
if ((*L)==NULL)
{
printf("单链表不存在\n");
}
else
{
int l=ListLength(*L);
if (l<2)
{
printf("单链表中至少要有两个元素才能进行排序\n");
}
else
{
int i;
Linklist p=(*L)->next;
Linklist q,s;
q=(Linklist)malloc(sizeof(LNode));
q->next=NULL;
s=(Linklist)malloc(sizeof(LNode));
s->data=p->data;
s->next=NULL;
q->next=s;//先将传入单链表的第一个节点的数据添加到新单链表中去
Linklist r=q->next;
p=p->next;
while(p->next!=NULL)
{
i=1;//i是用来确定后续插入位置的
while((p->data)>(r->data)&&r->next!=NULL)
{
i++;
r=r->next;
}
if ((p->data)>(r->data))
{
i++;
ListInsert(&q,i,p->data);
}
else
ListInsert(&q,i,p->data);
p=p->next;
r=q->next;
}
i=1;
while((p->data)>(r->data)&&r->next!=NULL)
{
i++;
r=r->next;
}
if ((p->data)>(r->data))
{
i++;
ListInsert(&q,i,p->data);
}
else
ListInsert(&q,i,p->data);
*L=q;
printf("排序完成\n");
}
}
}
再附上插入操作函数
void ListInsert(Linklist *L,int i,Elemtype e)
{
if (*L==NULL)
{
printf("单链表不存在\n");
}
else
{
int length=ListLength(*L);
if (i<1||i>length+1)
{
printf("输入错误\n");
}//判断输入的合法性
else
{
Linklist p=*L;
int j=0;
for (j = 0; j <i-1 ; j++)
{
p=p->next;
}//通过循环使p指向所要插入节点位置的前一个节点
Linklist *r;
(*r)=(Linklist)malloc(sizeof(LNode));
(*r)->data=e;
(*r)->next=p->next;
p->next=*r;//将新建立的节点插入
printf("插入成功\n");
}
}
}
这是操作情景,直接退回桌面了 呜呜呜