动态数据结构

您所在的位置:网站首页 单链表的创建(结构体+链表) 动态数据结构

动态数据结构

2024-07-03 14:45| 来源: 网络整理| 查看: 265

所谓建立动态链表,是指在程序执行过程中从无到有地建立一个链表。即我们需要一个个地去开辟新节点,并且去输入节点的数据信息,然后建立起前后相连的关系。

下面我们开始尝试建立起一个动态链表:

1.结构体部分:

struct weapon{ int price; int atk; struct weapon * next; };

2.然后我们写一个创建链表的函数:

这个函数要求返回的是链表的头指针(head),所以将函数定义为struct weapon *类型。

struct weapon * create(){ }

在该函数中,首先定义三个指针变量,head、p1、p2,这三个变量都用来指向struct weapon类型数据。head是链表的头指针,p1指向链表当前新创建的节点,p2指向上一个节点。

struct weapon * head; struct weapon * p1, * p2;

临时变量n用来记录节点的总个数。

int n = 0;

然后我们用malloc函数(注意引入头文件#include)去开辟第一个节点,先让p1与p2都指向第一个节点。其中,malloc是分配内存块的函数,sizeof是判断数据类型长度符。

p1 = p2 = (struct weapon * )malloc(sizeof(struct weapon));

之后,我们从键盘输入数据,赋值给第一个节点(p1)。由于最初链表不存在,所以给head置空。

scanf("%d %d",&(p1->price),&(p1->atk)); head = NULL;

接下来进入大批量输入数据的过程:

当遇到输入值为0时,输入过程结束:

while(p1-> price != 0){ }

对n进行++操作,且对n=1进行一个特殊处理(当n=1时,对于第一个添加到链表中的节点p1,让head指向元素的地址,这就是头指针):

n++; if(n == 1) { head = p1; }

如果不是第一个节点(即当n>1)时,就让当前节点的上一个节点去指向当前节点:

else{ //p2为上一节点 p2->next = p1; }

然后用p2保存当前节点(p1)的信息,再让p1去开辟新的动态存储区:

//更新 p2 = p1; p1 = (struct weapon * )malloc(sizeof(struct weapon));

开辟新的存储区后,进入新的输入环节:

scanf("%d %d",&(p1->price),&(p1->atk));

当输入完新的值后,再次回到while的判定区,判断值是否为0:

while(p1-> price != 0){ n++; if(n == 1) { head = p1; }else{ //p2为上一节点 p2->next = p1; } //更新 p2 = p1; p1 = (struct weapon * )malloc(sizeof(struct weapon)); scanf("%d %d",&(p1->price),&(p1->atk)); }

如果while循环结束,此时p2实际上是该链表的最后一个节点,我们将p2的next置空:

//此时p2为最后一个节点 p2->next = NULL;

最后,我们return头指针:

return (head);

create函数体完整代码:

struct weapon * create(){ struct weapon * head; struct weapon * p1, * p2; int n = 0; p1 = p2 = (struct weapon * )malloc(sizeof(struct weapon)); scanf("%d %d",&(p1->price),&(p1->atk)); head = NULL; while(p1-> price != 0){ n++; if(n == 1) { head = p1; } else{ //p2为上一节点 p2->next = p1; } //更新 p2 = p1; p1 = (struct weapon * )malloc(sizeof(struct weapon)); scanf("%d %d",&(p1->price),&(p1->atk)); } //此时p2为最后一个节点 p2->next = NULL; return (head); };

3.在main函数进行函数的调用:

int main() { struct weapon * p; p = create(); //打印头指针 printf("%d,%d",p->price,p->atk); return 0; }

4.完整代码如下:

#include #include struct weapon{ int price; int atk; struct weapon * next; }; struct weapon * create(){ struct weapon * head; struct weapon * p1, * p2; int n = 0; p1 = p2 = (struct weapon * )malloc(sizeof(struct weapon)); scanf("%d %d",&(p1->price),&(p1->atk)); head = NULL; while(p1-> price != 0){ n++; if(n == 1) { head = p1; } else{ //p2为上一节点 p2->next = p1; } //更新 p2 = p1; p1 = (struct weapon * )malloc(sizeof(struct weapon)); scanf("%d %d",&(p1->price),&(p1->atk)); } //此时p2为最后一个节点 p2->next = NULL; return (head); }; int main() { struct weapon * p; p = create(); //打印头指针 printf("%d,%d",p->price,p->atk); return 0; }

5.运行输入:

结果:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3