所谓建立动态链表,是指在程序执行过程中从无到有地建立一个链表。即我们需要一个个地去开辟新节点,并且去输入节点的数据信息,然后建立起前后相连的关系。
下面我们开始尝试建立起一个动态链表:
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<malloc.h>)去开辟第一个节点,先让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<stdio.h>
#include<malloc.h>
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.运行输入:
结果: