数据结构单链表删除节点出错(程序打印异常或者崩溃)?
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 10
#define OWERFLOW -2
typedef struct NODE
{
int data;
struct NODE *next;
}lnode,*linklist;
void Initlist(linklist*l)
{
(*l)=(linklist)malloc(sizeof(lnode));
(*l)->next=NULL;
}
int Listempty(linklist l)
{
if(l->next=NULL)
return 1;
return 0;
}
void Listinsert(linklist *l,int i,int e)
{
int j=0;
linklist s=(linklist)malloc(sizeof(lnode)),p=*l;
s->data=e;
while(p->next&&j<i-1)//p->next!=null<=>p->next
{p=p->next;++j;}
if(!p->next)//p->next==null<=>!p->next,
printf("插入不合法!\n");
else{
s->next=p->next;p->next=s;
printf("插入成功\n");
}
}
//删除节点
void Listdelete_L(linklist*l,int i,int *e) //*e表示删除节点
{
linklist p=*l;int j=0;//p表示要删除节点的前一节点,j用来计数;
while(p->next||j<i-1)
{
j++;
p=p->next;
}
if(!(p->next)||j>i-1)
{
printf("存在异常!\n");
}
linklist q=p->next;*e=q->data;
p->next=q->next;
free(q);
printf("删除成功!\n");
}
//头插法
void Createlist_H(linklist *l,int n)
{
int i;
if(!(*l)->next)//*l->next=null
{
printf("请输入%d个元素^(以空格隔开):",n);
for(i=n;i>0;i--)
{
linklist p=(linklist)malloc(sizeof(lnode));
scanf("%d",&p->data);
p->next=(*l)->next;
(*l)->next=p;
}
}
}
//尾插法
void Createlist_R(linklist*l,int n)
{
int i;linklist r=*l;
if(!(*l)->next)
{
printf("请输入%d个元素^(以空格隔开):",n);
for(i=n;i>0;i--)
{
linklist p=(linklist)malloc(sizeof(lnode));
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p;
}
}
}
void print(linklist l)
{
linklist p;
p=l;
while(p->next!=NULL)
{
p=p->next;
printf("%d\t",p->data);
}
printf("\n");
}
int destory(linklist *l)
{
linklist p=(linklist)malloc(sizeof(lnode));
while(*l)
{
p=*l;
*l=(*l)->next;
free(p);
}
return true;
}
void Clearlist(linklist *l)
{
linklist p,q;
p=(*l)->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
(*l)->next==NULL;
printf("您已清除链表!\n");
}
void Listlength(linklist l)
{
int i=0;
linklist p;
p=l->next;
while(p)
{
p=p->next;
i++;
}
printf("表长为%d\n",i);
}
int Locateelem(linklist l,int e)
{
int j=1;
linklist p=l->next;
while(p)
{
if(!p->next)
p=p->next;
j++;
if(p->data=e)
return j;
}
}
int main()
{
linklist L;int e;
Initlist(&L);
Createlist_R(&L,4);
print(L);
Listinsert(&L,2,3);
print(L);
printf("2的位置在%d\n",Locateelem(L,2));
Listlength(L);
Clearlist(&L);
return 0;
}
回复
1个回答
test
2024-06-29
void Listdelete_L(linklist *l, int i, int *e) {
linklist p = *l;
int j = 0;
while (p->next && j < i - 1) {
j++;
p = p->next;
}
if (!p->next || j > i - 1) {
printf("存在异常!\n");
return; // 如果位置不合法,直接返回
}
linklist q = p->next;
*e = q->data;
p->next = q->next;
free(q);
printf("删除成功!\n");
}
Listempty :
int Listempty(linklist l) {
if (l->next == NULL)
return 1;
return 0;
}
Locateelem:
int Locateelem(linklist l, int e) {
int j = 1;
linklist p = l->next;
while (p) {
if (p->data == e)
return j;
p = p->next;
j++;
}
return 0; // 如果没有找到元素,返回0
}
Clearlist :
void Clearlist(linklist *l) {
linklist p, q;
p = (*l)->next;
while (p) {
q = p->next;
free(p);
p = q;
}
(*l)->next = NULL; // 修改这里
printf("已清除链表!\n");
}
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容