数据结构单链表删除节点出错(程序打印异常或者崩溃)?

作者站长头像
站长
· 阅读数 5
#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个回答
avatar
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");
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容