一、动态链表个人理解
相当于可以动态分配内存空间、分配的内存空间不连续的结构体数组。它分为数据域和指针域两个部分,数据域和通常的结构体一样,指针域中存放了下一个节点的地址。头节点的数据域不存放数据,只有指针域中包含下一个节点的地址信息。尾结点的数据域包含数据,指针域为NULL。
二、动态链表与结构体数组的区别
(1)动态链表支持动态的分配内存空间,需要时进行申请,与结构体数组相比较不会造成内存资源的浪费。
(2)动态链表支持节点的动态扩容缩容,存储的数据行数可以随意变化,与结构体数组相比较更加灵活。
三、示意图
head
数据域(空)
指针域(地址A)
||
节点一(地址A)
数据域(xxx)
指针域(地址B)
||
节点二(地址B)
数据域(xxxx)
指针域(地址C)
||
尾结点(地址C)
数据域(xxxxx)
指针域(NULL)
四、代码实现内容
根据宏定义LINK_LIST_LEN的值创建相应长度的动态链表,并遍历输出链表。(代码中没有释放内存,嘿嘿,还没学到这一步,以后加上)
五、源码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LINK_LIST_LEN 8
struct student
{
int no;
char name[7];
int age;
struct student *next;
};
void main()
{
struct student *CreateLinkList(int len);
void SelectLinkList(struct student *head);
struct student *head;
head = CreateLinkList(LINK_LIST_LEN);
SelectLinkList(head);
}
struct student *CreateLinkList(int len)
{
printf("=========================\n");
printf("create link list len : %d\n",len);
struct student *head,*p,*q;
int i;
head = (struct student *)malloc(sizeof(struct student));
p = head;
for(i=1;i<=len-1;i++)
{
q = (struct student *)malloc(sizeof(struct student));
q->no = i;
strcpy(q->name,"lxgzxj");
q->age = i + 18;
p->next = q;
p = q;
if(i==len-1)
{
p->next = NULL;
}
}
return head;
}
void SelectLinkList(struct student *head)
{
printf("=========================\n");
printf("print link list(exclude head)\n");
struct student *p;
for(p=head->next;p!=NULL;p=p->next)
{
printf("no : %d , name : %s , age : %d\n",p->no,p->name,p->age);
}
}
六、运行结果