一、动态链表个人理解
相当于可以动态分配内存空间、分配的内存空间不连续的结构体数组。它分为数据域和指针域两个部分,数据域和通常的结构体一样,指针域中存放了下一个节点的地址。头节点的数据域不存放数据,只有指针域中包含下一个节点的地址信息。尾结点的数据域包含数据,指针域为NULL。
二、动态链表与结构体数组的区别
(1)动态链表支持动态的分配内存空间,需要时进行申请,与结构体数组相比较不会造成内存资源的浪费。
(2)动态链表支持节点的动态扩容缩容,存储的数据行数可以随意变化,与结构体数组相比较更加灵活。
三、示意图
head
数据域(空)
指针域(地址A)
||
节点一(地址A)
数据域(xxx)
指针域(地址B)
||
节点二(地址B)
数据域(xxxx)
指针域(地址C)
||
尾结点(地址C)
数据域(xxxxx)
指针域(NULL)
四、代码实现内容
根据宏定义link_LIST_LEN的值创建相应长度的动态链表,并遍历输出链表。(代码中没有释放内存,嘿嘿,还没学到这一步,以后加上)
五、源码
#include#include #include #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 : %dn",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 : %dn",p->no,p->name,p->age); } }
六、运行结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)