动态数据结构 |
您所在的位置:网站首页 › 单链表的创建(结构体+链表) › 动态数据结构 |
所谓建立动态链表,是指在程序执行过程中从无到有地建立一个链表。即我们需要一个个地去开辟新节点,并且去输入节点的数据信息,然后建立起前后相连的关系。 下面我们开始尝试建立起一个动态链表: 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 |