链式存储结构
链表的插入,删除比较方便,在给定前驱节点的时候,时间复杂度为O(1)
查找比较麻烦,要根据头指针一个一个往下找,时间复杂度为O(n)
单链表
头插法

使用头插法,读入数据的顺序与生成链表的元素顺序是相反的
#include "iostream" typedef struct LinkNode{ LinkNode *next; int data; } ; LinkNode *linkNodeInsert(){ LinkNode *head = (LinkNode *) malloc(sizeof (LinkNode)); LinkNode *s; head -> next = NULL; for (int i = 1; i <= 5; i++){ s = (LinkNode *) malloc(sizeof (LinkNode)); //结构体指针分配内存空间 s -> data = i; s -> next = head -> next; head -> next = s; } return head; } void display(LinkNode *head){ while (head -> next){ head = head -> next; //指针往后移一位数,指向下一个节点 printf("%d\n", head -> data); } } int main(){ LinkNode *head; head = linkNodeInsert(); display(head); }
尾插法
定义一个尾指针rear使之指向链表尾节点,不让每一次插入都要从头节点一直查找到尾节点

#include "iostream" typedef struct LinkNode{ LinkNode *next; int data; } ; LinkNode *linkNodeInsert(){ LinkNode *head = (LinkNode *) malloc(sizeof (LinkNode)); LinkNode *rear = head; //添加尾指针,使之指向链表的尾节点 for (int i = 1; i <= 5; i++){ LinkNode *s = (LinkNode *) malloc(sizeof (LinkNode)); s -> data = i; rear -> next = s; rear = s; } rear -> next = NULL; //使尾指针指向Null return head; } void display(LinkNode *head){ while (head){ head = head -> next; printf("%d\n", head -> data); } } int main(){ LinkNode *head; head = linkNodeInsert(); display(head); }
双链表
头插法
其实更单链表的创建差不多,只是该节点的指针可以指向改节点的前一个节点的地址
#include "iostream" typedef struct LinkNode{ int data; LinkNode *prior, *next; }; LinkNode *linkNode(){ LinkNode *head = (LinkNode *) malloc(sizeof (LinkNode)); head -> next = NULL; LinkNode *s; for (int i = 1; i <=5; i++){ s = (LinkNode *) malloc(sizeof (LinkNode)); s -> data = i; s -> next = head -> next; head -> next = s; s -> prior = s; //s节点向后移 } return head; } void display(LinkNode *head){ while (head -> next){ head = head -> next; printf("%d\n", head -> data); } } int main(){ LinkNode *head = linkNode(); display(head); }
尾插法
#include "iostream" typedef struct LinkNode{ int data; LinkNode *prior, *next; }; LinkNode *linkNode(){ LinkNode *head = (LinkNode *) malloc(sizeof (LinkNode)); LinkNode *rear = head; for (int i = 1; i <= 5; i++){ LinkNode *s = (LinkNode *) malloc(sizeof (LinkNode)); s -> data = i; rear -> next = s; s -> prior = rear; //指向前一个节点 rear = s; } rear -> next = NULL; return head; } void display(LinkNode *head){ while (head -> next){ head = head -> next; printf("%d\n", head -> data); } } int main(){ LinkNode *head = linkNode(); display(head); }
本文作者:MiYol
本文链接:https://www.cnblogs.com/miyol/p/16724852.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步