在开始我就将linklist定义为结构指针的情况下,为什么 1.还要在函数的形参前加(例如delete(linklist l,int)中的l)以及 2.在主函数中调用函数时在l前加取址(例如delete( &l,m)中的&l)还有 3.为什么在合并函数中,形参有的包含而有的不是(例如形参la与lb前没有而lc前有),调用该函数时,变量有的取址而有的不取(例如在lc前加&而la,lb不加)另外 4.在函数的创建与调用时,又该怎么使用和&符号呢
#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;
}