C语言书写单链表出现了致命错误,不知道怎么改
问题背景:
编写一个程序依次实现如下功能:
(1)在第i个元素之前插入一个元素e
(2)删除位序为i的元素,并将删除的节点的值由变量e返回;
(3)由变量e获取位序为i的元素的值;
(4)输出此表;
(5)退出程序时销毁此表。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define ok 1;
#define error 0;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct Node * next;
}LNode,* LinkList;
void InitList_L(LinkList L)
{
L=(LinkList)malloc(sizeof(LNode));
L->next = NULL;
}
void CreateList_L(LinkList L, int n)
{
LNode *r,*s;//*r是尾指针
ElemType c, flag=1;
r=L;//动态指向当前表尾
while(flag)
{
scanf("%d",&c);
if(c!=0)
{
s=(LNode*)malloc(sizeof(LNode));
s->data = c;
r->next = s;
r = s;
}
else
{
flag=0;
r->next=NULL;
}
}
}
int ListInsert_L(LinkList L, int i,ElemType e)//单链表的插入
{
LNode *pre,*s;
int k;
pre=L;
k=0;
if(i<=0)
return error;
while(pre!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}//查找第i-1个结点
if(pre==NULL)
return error;
s=(LNode*)malloc(sizeof(LNode));//申请一个新的结点
s->data=e;//e放到s的数据域
s->next=pre->next;//pre next域替换成 s next域
pre->next=s;
return ok;
}
int ListDelete_L(LinkList L, int i,ElemType *e)
{
LNode *pre,*r;
int k;
pre=L;
k=0;
while(pre->next!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(pre->next==NULL)
return error;
r=pre->next;
pre->next=r->next;
*e=r->data;
free(r);
return ok;
}
LNode *LocateElem_L(LinkList L, int e)
{
LinkList p;
p = L->next;
while (p && p->data!= e)
p = p->next;
return p;
}
int main()
{
int a, n,length;
char choose;
ElemType e;
//LNode L;
LinkList L, p;
InitList(L);
while (1)
{
printf("1-- 建立\n");
printf("2-- 输入\n");
printf("3-- 插入\n");
printf("4-- 删除\n");
printf("5-- 查找\n");
printf("6-- 输出\n");
printf("0-- 退出\n\n");
printf("请选择:");
scanf("%d,&choose");
switch (choose)
{
case '1': //建立一个单链表
if (InitList_L(L))
printf("成功建立链表!");
break;
case '2': //使用后插法创建单链表
CreateList_L(L, length);
printf("输入单链表\n\n");
break;
case '3': //单链表的插入
printf("请输入元素插入的位置a:");
scanf("%d;&a");
printf("请输入待插入的元素e:");
scanf("%d;&e");
if (ListInsert_L(L, a, e))
printf("插入成功.");
else
printf("插入失败!");
break;
case '4': //单链表的删除
printf("请输入待删除元素的位置:");
scanf("%d;&a");
if (ListDelete_L(L, a, e))
printf("删除成功!\n\n");
else
printf("删除失败!\n\n");
break;
case '5': //单链表的查找
printf("请输入所要查找的位置:");
scanf("%d;&a");
if (LocateElem_L(L, a) != NULL)
{
printf("查找成功 查找的值为:%d\n",LocateElem_L(L,a)->data);
} else
printf("查找失败! \n\n");
break;
case '6': //单链表的输出
printf("该单链表的内容为:\n\n");
p=L->next;
while(L->next!=NULL)
{
printf("%d,L->next->date");
L=L->next;
}
printf("\n");
break;
}
}
return 0;
}