一、问题
创建动态链表就是指在程序执⾏过程中,从⽆到有,按照需求开辟结点和输⼊各结点数据,并建⽴起前后相连接的关系。那么,如何创建动态链表呢?
二、解答
以建⽴⼀个有任意名学⽣数据的单向动态链表为例,可以根据需要,动态地为学⽣分配内存,直到输⼊学号为 0 ,则结束输⼊,不再创建,然后将动态创建的学⽣信息输出。 创建⼀个动态链表函数的相应代码如下。
stu *creat(void)
{stu *head, *p1, *p2;n = 0;p1 = p2 = (stu *)malloc(LEN);scanf("%d,%d,%f", &p1->num, &p1->age, &p1->score);head = NULL;while (p1->num != 0){n = n + 1;if (n == 1){head = p1;}else{p2->next = p1;}p2 = p1;p1 = (stu *)malloc(LEN);scanf("%d,%d,%f", &p1->num, &p1->age, &p1->score);}p2->next = NULL;return head;
}
在创建函数中,若输⼊学号为 0 ,则说明链表建⽴完成。建⽴链表之前,⾸先使 head 指向⼀个空指针,表⽰此时的链表⽆结点,当建⽴了第⼀个结点后,就令 head 指向该结点。
实现创建链表的过程如下:
(1)在为 p1 和 p2 开辟了内存空间后,从键盘输⼊⼀个学⽣的数据信息给 p1 所指的第⼀个结点。若学号不为0,则这输⼊的是第⼀个数据,即 n=1,那么令 head 指向该结点, 即 head=p1,把 p1 的值赋给 head,如图所示。
(2)建⽴完第⼀个结点后,再开辟⼀个结点并使 p1指向该结点。向结点中输⼊数据, 如果第⼆个结点的学号不为 0 ,此时 n=2,则第⼆个结点就是第⼀个结点的直接后继。使 p2 的指针域指向第⼆个结点,建⽴联系,此时链表的形式如图所示。
(3)第⼆个结点建⽴后,使 p2 指向新建⽴的第⼆个结点,⽅便 pl 再去开辟新的内存,建⽴下⼀个结点。建⽴下⼀个结点的⽅法同(2),第三个结点的建⽴如下图所示。
(4)下⼀个结点的建⽴⽅法同(2),直到键盘输⼊学号为 0,则链表建⽴结束,学号为 0 这个结点不连接到链表中。
创建动态链表结束后,就可以在主函数中调⽤创建函数。该创建函数⽆传递参数,返回值为头指针。创建链表结束后,输出学⽣数据,运⾏结果如图所示。
101,18,90,0
102,20,89,3
103,19,88,3
0
101,18,90.000000
102,20,89,300003
103,19,88.300003
三、总结
在创建动态链表的函数中,需要注意在开辟完⼀个结点后,需要先向结点中输⼊数据, 再将前⼀个结点与后⼀个结点建⽴联系,即前⼀个结点的指针域指向后⼀个结点,这样才能将开辟的结点建⽴链式结构。