打了链表 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);

}

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

#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);

    }
}

修改ListCreate函数的参数为LinkList指针(在打印链表时发现使用LinkList传参,LinkList的值没有传回main函数,所以修改为LinkList指针,其他函数没有测试),然后修改了一些参数函数名字错误,可以遍历链表La了,如下:


#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;
}

//链表的遍历
Status ListTraverse(LinkList L) {
LinkList p;
printf("1\n");
printf("p=%p,L=%p\n",p,L);
p = L->next;
printf("2\n");

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>>");
}

//主函数
int 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) {
            GetElem(La, m, e);
        }
        else if (t == 2) {
            GetElem(Lb, m, e);
        }
        else if (t == 3) {
            GetElem(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) {
            ListIncert(&La, m, e);
        }
        else if (t == 2) {
            ListIncert(&Lb, m, e);
        }
        else if (t == 3) {
            ListIncert(&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");
        ListTraverse(Lc);
    }
 
    OrderPrint();
    scanf("%d", &k);
    
    
    }
    
return 0;
}

其他问题看不了,但是看出来明显错误,main函数中,if语句,应该用==,而不是=,单独一个是赋值,两个=才是比较

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633