白日梦也迷茫 2021-09-28 20:15 采纳率: 90.5%
浏览 127
已结题

设有头结点单链表,实现单链表删除

【输入形式】
第一行输入N,表示单链表表长为N;
第二行输入N个整数,建立有头结点单链表;
第三行输入一个整数M,表示删除结点位置为M(即第M个元素)。
【输出形式】
若删除成功,先输出删除结点的值;下一行输出删除后单链表的所有元素;
若删除不成功,输出error。
【样例输入1】
5
10 20 30 40 50
2
【样例输出1】
20
10 30 40 50
【样例输入2】
10
10 20 30 40 50 60 70 80 90 100
0
【样例输出2】
error


/*单链表删除*/

#include <stdio.h>
#include <stdlib.h>
#define  ERROR  0
#define  OK  1

typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

int CreateList(LinkList *L,int n)
{
    LNode *p,*q;
    int i;
    *L=(LinkList)malloc(sizeof(LNode));
    if(!*L)
        return ERROR;
    (*L)->next=NULL;
    p=*L;
    for(i=0;i<n;i++)
    {
        q=(LNode *)malloc(sizeof(LNode));
        if(!q)
            return ERROR;
        scanf("%d ",&q->data);
        q->next=NULL;
        p->next=q;
        p=q;
    }
    return OK;
}

int DelList(LinkList L,int i,ElemType *e)
{
    LNode *p=L,*s;
    int j=0;
    while(p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i-1)
        return ERROR;
    s=p->next;
    p->next=s->next;
    *e=s->data;
    free(s);
    return OK;
}

void PrintList(LinkList L)
{
    LNode *p;
    p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
}

int main()
{
    LinkList L=NULL;
    int n,i;
    ElemType e;
    scanf("%d",&n);
    CreateList(&L,n);
    scanf("%d",&i);
    DelList(&L,i,&e);
    if(!DelList(&L,i,&e))
    {
        printf("error");
        return 0;
    }
    PrintList(L);
    return 0;
}

现在程序能成功编译,但是运行的时候输入完所有内容就直接结束了

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2021-09-28 22:53
    关注

    修改见注释,供参考:

    /*单链表删除*/
    #include <stdio.h>
    #include <stdlib.h>
    #define  ERROR  0
    #define  OK  1
    typedef int ElemType;
    typedef struct LNode
    {
        ElemType data;
        struct LNode *next;
    }LNode,*LinkList;
    int CreateList(LinkList *L,int n)
    {
        LNode *p,*q;
        int i;
        *L=(LinkList)malloc(sizeof(LNode));
        if(!*L)
            return ERROR;
        (*L)->next=NULL;
        p=*L;
        for(i=0;i<n;i++)
        {
            q=(LNode *)malloc(sizeof(LNode));
            if(!q)
                return ERROR;
            scanf("%d ",&q->data);
            q->next=NULL;
            p->next=q;
            p=q;
        }
        return OK;
    }
    int DelList(LinkList L,int i,ElemType *e)
    {
        LNode *p=L,*s;
        int j=0;
        while(p&&j<i-1)
        {
            p=p->next;
            j++;
        }
        if(!p->next || j>i-1)  //if(!p || j>i-1)
            return ERROR;
        s=p->next;
        p->next=s->next;
        *e=s->data;
        free(s);
        return OK;
    }
    void PrintList(LinkList L)
    {
        LNode *p;
        p=L->next;
        while(p!=NULL)
        {
            printf("%d ",p->data);
            p=p->next;
        }
    }
    int main()
    {
        LinkList L=NULL;
        int n,i;
        ElemType e;
        scanf("%d",&n);
        CreateList(&L,n);
        scanf("%d",&i);
                             //DelList(L,i,&e);
        if(DelList(L,i,&e))
        {
            printf("%d\n",e);
            PrintList(L);
        }
        else
            printf("error\n");
                             //PrintList(L);
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月3日
  • 已采纳回答 9月29日
  • 创建了问题 9月28日

悬赏问题

  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用