mmh_Wall 2022-04-06 22:48 采纳率: 60%

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

//创建一个链表
Status ListCreate(LinkList L, int n) {
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++) {
p->next = s;
q = s;
p = q;
printf("输入该链表的第%d个元素！\n", i);
scanf("%d", &p->data);
}

p->next = NULL;

return OK;
``````

}

//链表的遍历
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;

``````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) {
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) {
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;
``````

}

//将两个由小到大的链表排序；
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() {

``````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;

//创建一个链表
int i;

(*L)->data = -1;  //L->data = NULL;
(*L)->next = NULL;
p = (*L);
if (n <= 0) {   //修改
return ERROR;
}
for (i = 1; i <= n; i++) {
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;
}

//链表的遍历
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;

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) { //修改
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->data = e;
s->next = p->next;
p->next = s;
return OK;
}

//链表的删除
Status ListDelete(LinkList L, int m, ELemType e) {
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;
}

//将两个由小到大的链表排序；
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);

}
}

``````
本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

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

#### 悬赏问题

• ¥50 易语言把MYSQL数据库中的数据添加至组合框
• ¥20 求数据集和代码#有偿答复
• ¥15 关于下拉菜单选项关联的问题
• ¥20 java-OJ-健康体检
• ¥15 rs485的上拉下拉，不会对a-b<-200mv有影响吗，就是接受时，对判断逻辑0有影响吗
• ¥15 使用phpstudy在云服务器上搭建个人网站
• ¥15 应该如何判断含间隙的曲柄摇杆机构，轴与轴承是否发生了碰撞？
• ¥15 vue3+express部署到nginx
• ¥20 搭建pt1000三线制高精度测温电路
• ¥15 使用Jdk8自带的算法，和Jdk11自带的加密结果会一样吗，不一样的话有什么解决方案，Jdk不能升级的情况