无头结点链表删除结点问题(数据结构c)!!!

2024-12-26 09:31:07
推荐回答(1个)
回答1:

#include"stdio.h" /*单链表方式的实现*/
#include"malloc.h"

typedef char ElemType;
typedef struct LNode /*定义链表结点类型*/
{
ElemType data;
struct LNode * next;
}LinkList;//LNode,* LinkList;

/*建立链表,输入元素,用头插法建立带头结点的单链表(逆序),输入0结束*/
LinkList *CreateList_L(LinkList * L)
{
//Linklist *L=NULL;
LinkList *p;
ElemType temp;
printf("请输入结点值(输入0结束):");
fflush(stdin); //清除键盘缓冲区
scanf("%c",&temp);
while(temp!='0')
{
p=(LinkList *)malloc(sizeof(LinkList));
p->data=temp;
p->next=L;L=p;
scanf("%c",&temp);
}
return L;
}
/*获得元素e在链表L中的位置*/
int LocateElem(LinkList * L,ElemType e)
{
LinkList * p=L->next;
int i=1;
while(p!=NULL&&p->data!=e)
{
p=p->next;
i++;
}
if(p==NULL)
{
printf("输入的元素不存在!\n");
return(0);
}
else
return(i);

}
/*在带头结点的单链表中删除第i个位置(从1开始)的元素*/
int ListDel_L(LinkList * L,int i,ElemType e)
{
int j=0;
LinkList *p=L,*q;
while(j {
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
q=p->next;
if(q==NULL) return 0;
e=q->data;
p->next=q->next;
free(q);
printf("恭喜您,删除成功!\n");
return 1;
}
}
/*顺序输出链表的内容*/
void ListPint_L(LinkList * L)
{
LinkList * p;
int i=0;
p=L->next; /*p指向第一个结点*/
if(p == NULL)
{
printf("链表中没有元素!\n");
return;
}
while(p!=NULL)
{
i++;
printf("第%d个元素是:",i);
printf("%c\n",p->data);
p=p->next;
}
}

void main()
{
int i;
char cmd,e;
LinkList * L;
L=(LinkList *)malloc(sizeof(LinkList));/*头结点*/
L->next=NULL;
CreateList_L(L);
ListPint_L(L);
do
{
printf("请选择命令:\n");
printf("1,进行删除\n");
printf("2,退出\n");
do
{
fflush(stdin);
scanf("%c",&cmd);
}while((cmd!='1')&&(cmd!='2'));
switch(cmd)
{
case'1':
printf("请输入你要删除的元素:");
fflush(stdin);
scanf("%c",&e);
i=LocateElem(L,e);
ListDel_L(L,i,e);
ListPint_L(L);
break;
}
}while(cmd!='2');
}
这样改就行了:
有三处错误:
1) while(temp!='0')
{
p=(LinkList *)malloc(sizeof(LinkList));
p->data=temp;
p->next=L;L=p;
scanf("%c",&temp);
}
return L;
}
/*获得元素e在链表L中的位置*/
int LocateElem(LinkList * L,ElemType e)
{
LinkList * p=L->next;
int i=1;
while(p!=NULL&&p->data!=e)
{
p=p->next;
i++;
}
if(p==NULL)
{
printf("输入的元素不存在!\n");
return(0);
}
else
return(i);

}
你这个函数是嵌套定义的
2) int LocateElem(struct LinkList * L,ElemType e)
第一个参数应改为LinkList *L
3) /*获得元素e在链表L中的位置*/
int LocateElem(stLinkList * L,ElemType e)
{
char e;
LinkList * p=L->next;
char e重复定义,应删去。