mmh_Wall 2022-04-06 22:48 采纳率: 60%
浏览 91
已结题

打了链表 0错误但跑不了,如何解决?(语言-c语言)

#include <stdio.h>
#include <malloc.h>

#define ERROR 0
#define OK 1
typedef int ELemType;
typedef int Status;

typedef struct Node {
int data;
struct Node* next;
} Node;

typedef struct Node* LinkList;

//创建一个链表
Status ListCreate(LinkList L, int n) {
LinkList p, q, s;
int i;

L = (LinkList)malloc(sizeof(ELemType));
L->data = NULL;
L->next = NULL;
p = L;

if (n < 0) {
    return ERROR;
}

for (i = 1; i <= n; i++) {
    s = (LinkList)malloc(sizeof(ELemType));
    p->next = s;
    q = s;
    p = q;
    printf("输入该链表的第%d个元素!\n", i);
    scanf("%d", &p->data);
}

p->next = NULL;

return OK;

}

//链表的遍历
void ListTraverse(LinkList L) {
LinkList p;
p = L;

while (p) {
    printf("%d  ", p->data);
    p = p->next;
}
printf("\n");

return OK;

}

//链表的查找
Status GetElem(LinkList L, int m, ELemType e) {
int i;
LinkList p = L;

if (!L->next) {
    printf("你的链表为空!\n");
    return ERROR;
}

for (i = 1; i <= m; i++) {
    p = p->next;
    if (!p) {
        return ERROR;
    }
}

e = p->data;

return OK;

}

//链表的插入
Status ListIncert(LinkList* L, int m, ELemType e) {
LinkList p, s;
p = *L;
int i;
s->data = e;

if (m < 0) {
    return ERROR;
}

for (i = 1; i < m; i++) {
    p = p->next;
    if (!p) {
        return ERROR;
    }
}

s->next = p->next;
p->next = s;

return OK;

}

//链表的删除
Status ListDelete(LinkList* L, int m, ELemType e) {
LinkList p;
int i;
p = (*L);

if (m < 0) {
    return ERROR;
}

for (i = 1; i < m; i++) {
    p = p->next;
    if (!p) {
        return ERROR;
    }
}

p->next = p->next->next;

return OK;

}

//将两个由小到大的链表排序;
void MergeList(LinkList La, LinkList Lb, LinkList* Lc) {
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
pc = La;

while (pa && pb) {
    if (pa->data <= pb->data) {
        pc->next = pa;
        pa = pa->next;
        pc = pc->next;
    }
    else {
        pc->next = pb;
        pb = pb->next;
        pc = pc->next;
    }
}

pc->next = pa ? pa : pb;

}

//构建一个打印菜单的函数
void OrderPrint() {
;
printf("以下是您可以进行的操作:\n");
printf("1.创建一个链表\n");
printf("2.遍历一个链表\n");
printf("3.查找链表中的元素\n");
printf("4.插入一个元素\n");
printf("5.删除一个元素\n");
printf("6.将La与Lb合为一个递增数列\n");
printf("7.输入指令前的数字代表执行该指令,输入0退出程序\n");

printf("请输入您的指令:\n>>");

}

//主函数
void main() {
LinkList La, Lb, Lc;

int n, m, k, e, t;

OrderPrint();
scanf("%d", &k);

while (k) {

    if (k = 1) {

        printf("创建1.La\n创建2.Lb\n创建Lc\n");
        printf("请输入您的指令:\n>>");
        scanf("%d", &t);
        if (t = 1) {
            printf("输入链表的长度!>>\n");
            scanf("%d", &m);
            ListCreate(La, m);
        }
        else if (t = 2) {
            printf("输入链表的长度!>>\n");
            scanf("%d", &m);
            ListCreate(Lb, m);
        }
        else if (t = 3) {
            printf("输入链表的长度!\n>>");
            scanf("%d", &m);
            ListCreate(Lc, m);
        }
        else {
            printf("ERROR!");
        }
        t = 0;
    }

    if (k = 2) {
        printf("遍历链表1.La\n2.Lb\n3.Lc\n");
        printf("请输入您的指令:\n>>");
        scanf("%d", &t);
        if (t = 1) {
            ListTraverse(La);
        }
        else if (t = 2) {
            ListTraverse(Lb);
        }
        else if (t = 3) {
            ListTraverse(Lc);
        }
        else {
            printf("ERROR!");
        }


    }

    if (k = 3) {
        printf("查找1.La\n2.Lb\n3.Lc\n");
        printf("输入您查找的链表和元素位置!\n>>");
        scanf("%d %d", &t, &m);
        if (t = 1) {
            ListGetElem(La, m, e);
        }
        else if (t = 2) {
            ListGetElem(Lb, m, e);
        }
        else if (t = 3) {
            ListGetElem(Lc, m, e);
        }
        else {
            printf("ERROR!");
        }
        printf("该元素为%d", e);
    }

    if (k = 4) {
        printf("将元素插入1.La\n2.Lb\n3.Lc\n");
        printf("选择你想插入的链表,位置,和插入的元素!\n>>");
        scanf("%d %d %d", &t, &m, &e);
        if (t = 1) {
            ListIncer(*La, m, e);
        }
        else if (t = 2) {
            ListIncer(*Lb, m, e);
        }
        else if (t = 3) {
            ListIncer(*Lc, m, e);
        }
        else {
            printf("ERROR!\n");
        }
    }

    if (k = 5) {
        printf("输入你想删除的元素属于的链表,位置");
        printf("1.La\n2.Lb\n3.Lc\n");
        scanf("%d %d", &t, &m);

        if (t = 1) {
            ListDelete(La, m, e);
        }
        else if (t = 2) {
            ListDelete(Lb, m, e);
        }
        else if (t = 3) {
            ListIncert(Lc, m, e);
        }
        else {
            printf("ERROR!");
        }
    }

    if (k = 6) {
        MergeList(La, Lb, Lc);
        printf("合并后的链表为:\n");
        ListTravers(Lc);
    }

    OrderPrint();
    scanf("%d", &k);

}
  • 写回答

4条回答 默认 最新

  • qzjhjxj 2022-04-07 13:05
    关注

    整体修改如下,修改处见注释,供参考:

    #include <stdio.h>
    #include <malloc.h>
    #define ERROR 0
    #define OK 1
    typedef int ELemType;
    typedef int Status;
    
    typedef struct _Node { //修改
        int data;
        struct _Node* next;
    }Node, * LinkList;    //修改
    
    //typedef struct _Node* LinkList;//修改
    
    //创建一个链表
    Status ListCreate(LinkList* L, int n) {  //LinkList L 修改
        LinkList p, s; // q,
        int i;
    
        (*L) = (LinkList)malloc(sizeof(Node)); 
        //L = (LinkList)malloc(sizeof(ELemType));修改
        (*L)->data = -1;  //L->data = NULL;
        (*L)->next = NULL;
        p = (*L);
        if (n <= 0) {   //修改
            return ERROR;
        }
        for (i = 1; i <= n; i++) {
            s = (LinkList)malloc(sizeof(Node));
            //(LinkList)malloc(sizeof(ELemType));修改
            s->next = NULL;
            printf("输入该链表的第%d个元素!\n", i);
            scanf("%d", &s->data);  // &p->data
            p->next = s;
                    //q = s;
            p = s;  //p = q;
        }
                   //p->next = NULL;
        return OK;
    }
    
    //链表的遍历
    void ListTraverse(LinkList L) {
        LinkList p=NULL;
        if (L == NULL || L->next == NULL)  return;  //修改
        p = L;
        while (p->next) {                   //修改
            printf("%d  ", p->next->data);  // p->data
            p = p->next;
        }
        printf("\n");
                     //return OK; 修改 这函数没有返回值 
    }
    
    //链表的查找
    Status GetElem(LinkList L, int m, ELemType* e) { //修改
        int i;
        LinkList p = NULL;
    
        if (!L || !L->next) {    //修改
            printf("你的链表为空!\n");
            return ERROR;
        }
        if (m <= 0) {            //修改
            (*e) = -1;
            return ERROR;
        }
        for (i = 0, p = L; p && i < m; i++) {  //for (i = 1; i <= m; i++) 修改
            p = p->next;
        }
        if (!p) {                //修改
            (*e) = -1;
            return ERROR;
        }
        (*e) = p->data;
        return OK;
    }
    
    //链表的插入
    Status ListIncert(LinkList L, int m, ELemType e) { //修改
        LinkList p=NULL, s=NULL;
        if (!L) {    //修改
            printf("你的链表为空!\n");
            return ERROR;
        }
        int i;
        if (m <= 0) {
            return ERROR;
        }
    
        for (i = 0, p = L; p->next && i < m - 1; i++) { //修改
            p = p->next;
        }
        s = (LinkList)malloc(sizeof(Node)); //修改
        s->data = e;
        s->next = p->next;
        p->next = s;
        return OK;
    }
    
    //链表的删除
    Status ListDelete(LinkList L, int m, ELemType e) {
        LinkList p = NULL;
        int i;
        if (!L || !L->next) {  //修改
            printf("你的链表为空!\n");
            return ERROR;
        }
        if (m <= 0) {      //修改
            return ERROR;
        }
    
        for (i = 0, p = L; p->next && i < m - 1; i++) { //修改
            p = p->next;
        }
        p->next = p->next->next;
        return OK;
    }
    
    //将两个由小到大的链表排序;
    void MergeList(LinkList La, LinkList Lb) {  //修改
        LinkList pa = NULL, pb = NULL, pc = NULL;
        pa = La->next;
        pb = Lb->next;
        pc = La;  //修改
    
        while (pa && pb) {
            if (pa->data <= pb->data) {
                pc->next = pa;
                pc = pa;     //修改
                pa = pa->next;
            }
            else {
                pc->next = pb;
                pc = pb;    //修改
                pb = pb->next;
            }
        }
        pc->next = pa ? pa : pb;
        Lb->next = NULL;
    }
    
    //构建一个打印菜单的函数
    void OrderPrint() {
        printf("以下是您可以进行的操作:\n");
        printf("1.创建一个链表\n");
        printf("2.遍历一个链表\n");
        printf("3.查找链表中的元素\n");
        printf("4.插入一个元素\n");
        printf("5.删除一个元素\n");
        printf("6.将La与Lb合为一个递增数列\n");
        printf("7.输入指令前的数字代表执行该指令,输入0退出程序\n");
    
        printf("请输入您的指令:\n>>");
    }
    //主函数
    void main() {
        LinkList La = NULL, Lb = NULL, Lc = NULL;  //修改
        int n, m, k, e, t;
    
        OrderPrint();
        scanf("%d", &k);
    
        while (k) {
    
            if (k == 1) {  //if (k = 1)
    
                printf("创建1.La\n创建2.Lb\n创建Lc\n");
                printf("请输入您的指令:\n>>");
                scanf("%d", &t);
                if (t == 1) {
                    printf("输入链表的长度!>>\n");
                    scanf("%d", &m);
                    ListCreate(&La, m);  //ListCreate(La, m);
                }
                else if (t == 2) {
                    printf("输入链表的长度!>>\n");
                    scanf("%d", &m);
                    ListCreate(&Lb, m);  //ListCreate(Lb, m);
                }
                else if (t == 3) {
                    printf("输入链表的长度!\n>>");
                    scanf("%d", &m);
                    ListCreate(&Lc, m);  //ListCreate(Lc, m); 
                }
                else {
                    printf("ERROR!\n");
                }
                t = 0;
            }
    
            if (k == 2) {
                printf("遍历链表1.La\n2.Lb\n3.Lc\n");
                printf("请输入您的指令:\n>>");
                scanf("%d", &t);
                if (t == 1) {
                    ListTraverse(La);
                }
                else if (t == 2) {
                    ListTraverse(Lb);
                }
                else if (t == 3) {
                    ListTraverse(Lc);
                }
                else {
                    printf("ERROR!\n");
                }
    
    
            }
    
            if (k == 3) {
                printf("查找1.La\n2.Lb\n3.Lc\n");
                printf("输入您查找的链表和元素位置!\n>>");
                scanf("%d %d", &t, &m);
                if (t == 1) {
                    GetElem(La, m, &e);  //ListGetElem(La, m, e);
                }
                else if (t == 2) {
                    GetElem(Lb, m, &e);  //ListGetElem(Lb, m, e);
                }
                else if (t == 3) {
                    GetElem(Lc, m, &e); //ListGetElem(Lc, m, e);
                }
                else {
                    printf("ERROR!");
                }
                printf("该元素为%d\n", e);
            }
    
            if (k == 4) {
                printf("将元素插入1.La\n2.Lb\n3.Lc\n");
                printf("选择你想插入的链表,位置,和插入的元素!\n>>");
                scanf("%d %d %d", &t, &m, &e);
                if (t == 1) {
                    ListIncert(La, m, e);   //ListIncer(*La, m, e); 
                }
                else if (t == 2) {
                    ListIncert(Lb, m, e);   //ListIncer(*Lb, m, e);
                }
                else if (t == 3) {
                    ListIncert(Lc, m, e);  //ListIncer(*Lc, m, e);
                }
                else {
                    printf("ERROR!\n");
                }
            }
    
            if (k == 5) {
                printf("输入你想删除的元素属于的链表,位置");
                printf("1.La\n2.Lb\n3.Lc\n");
                scanf("%d %d", &t, &m);
    
                if (t == 1) {
                    ListDelete(La, m, e);
                }
                else if (t == 2) {
                    ListDelete(Lb, m, e); 
                }
                else if (t == 3) {
                    ListDelete(Lc, m, e);   //ListIncert(Lc, m, e);
                }
                else {
                    printf("ERROR!\n");
                }
            }
    
            if (k == 6) {
                MergeList(La, Lb);    //MergeList(La, Lb, Lc);修改
                printf("合并后的链表为:\n");
                ListTraverse(La);    //修改
            }
            OrderPrint();
            scanf("%d", &k);
    
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月17日
  • 已采纳回答 4月9日
  • 创建了问题 4月6日

悬赏问题

  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法
  • ¥15 八路抢答器设计出现故障
  • ¥15 opencv 无法读取视频
  • ¥15 按键修改电子时钟,C51单片机