#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