LucienMa 2022-04-07 14:01 采纳率: 60%
浏览 12

链表中的指针变量如何正确运用(见内容)

在开始我就将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;
}

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-04-07 16:15
    关注

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

    评论

报告相同问题?

问题事件

  • 创建了问题 4月7日

悬赏问题

  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询