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