数据结构|实现一个链表[4]
2020-12-30 20:49
986 查看
链表的实现
先要构建合适的链表结构。下面是构建双向循环链表,应该是结构最复杂的链表。
typedef struct JD{
int data;
struct JD *prior;
struct JD *next;
}JD; //创建JD
如上面的代码,就是构建了链表在内存中的存储结构,
int data是需要存储的int数据。
struct JD *prior则是定义指向前面一个链表结构体的指针。
struct JD *next同理是指向下一个链表结构体的指针。所以这个链表的结构共计三个部分,记录数据,指向下一个链表块,指向上一个链表块。
那么怎么实现链表的创建呢。首先我们定义一个当前选中的链表结构体,作为head。第一个元素的时候,需要我们自己把两个指针各自指向自己,记录数据也需要手动填充。
之后则是开辟新的空间,添加下一个链表块。
for(;i<10;i++){
node=(JD *)malloc(sizeof(JD));
node->data=a[i];
p->next=node;
node->prior=p;
p=p->next;
}
如上面,一共需要设置10长度的链表。
node=(JD *)malloc(sizeof(JD))开辟了一个链表元素长度的空间,并且按照我们定义的JD结构生成。
node->data=a[i]设置我们需要记录的值。
p->next=node把前一个元素的next指针指向当前的node,
node->prior=p把当前node的指向前一个指针的指向前一个元素p。
p=p->next把当前的元素设置到下一个。
等到结束之后,有两种处理方式,最后一个节点的指向后一个元素的指针为NULL,则链表结束。另一个则是构成循环链表,把最后一个链表的指向下一个元素的指针指到head。
p->next=head;
head->prior=p;
p是当前的node,最后一个时则表示最后一个node。
p->next=head指向的链表的头,
head->prior=p指向的结尾node。
关于头部的处理
JD *node,*p,*head;
p=(JD *)malloc(sizeof(JD));
head=p;
为了找到链表的遍历入口,我们可以使用指针记录head的地址。
结尾附上源代码
#include "stdio.h"
#include "malloc.h"
typedef struct JD{
int data;
struct JD *prior;
struct JD *next;
}JD; //创建JD
JD *createList(){ //
int a[10]={1,4,9,16,25,36,49,64,81,100},i=0;
JD *node,*p,*head;
p=(JD *)malloc(sizeof(JD));
head=p;
for(;i<10;i++){
node=(JD *)malloc(sizeof(JD));
node->data=a[i];
p->next=node;
node->prior=p;
p=p->next;
}
p->next=head;
head->prior=p;
return p;
}
void printList1(JD *p){
int i=0;
JD *temp=p;
printf("顺序打印:");
while(temp->data!=1){
temp=temp->next;
} //从1开始打印
for(;i<10;i++){
printf("%d ",temp->data);
temp=temp->next;
}
printf("\n\n");
}
void printList2(JD *p){
int i=0;
JD *temp=p;
printf("逆序打印:");
for(;i<10;i++){
printf("%d ",temp->data);
temp=temp->prior;
}
printf("\n\n");
}
void delete25(JD *p){
int i=0;
while(p->data!=1){
p=p->next;
} //从1开始打印
printf("删除25后打印:");
for(;i<9;i++){
if(p->data!=25){
printf("%d ",p->data);
p=p->next;
}
if(p->next->data==25){
p->next=p->next->next;
p->next->prior=p;
} //删除25
}
printf("\n\n");
}
void add50(JD *p){
int i=0;
JD *node;
node=(JD *)malloc(sizeof(JD));
node->data=50; //创建50的结点
printf("增加50后打印:");
while(p->data!=49){
p=p->next;
if(p->data==49){
node->prior=p;
node->next=p->next;
p->next=node;
p->next->prior=node;
}
}
while(p->data!=1)
p=p->next; //确保从1开始打印
for(;i<10;i++){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main(){
JD *head;
head=createList();//创建双向循环链表
printList1(head);//顺序打印链表
printList2(head); //逆序打印链表
delete25(head);//删除25并顺序打印
add50(head);//增加50并顺序打印
return 0;
}
相关文章推荐
- Redis跳表是一种怎么样的数据结构(Java设计分析)
- 算法工程师思维导图—数据结构与算法
- 图解java数据结构之栈(Stack),你确定不看看吗?
- 浅谈数据结构之树,以后再也不怕面试官问了!
- Redis内部数据结构详解(4)——ziplist
- Redis内部数据结构详解(5)——quicklist
- 【计算机科学】数据结构——绪论
- Redis数据结构
- 【硬核】机器学习与数据结构的完美结合——KD-tree
- 动态规划入门——动态规划与数据结构的结合,在树上做DP
- 原创 | ACMer不得不会的线段树,究竟是种怎样的数据结构?
- GitHub上最火的、最值得前端学习的几个数据结构与算法项目!没有之一!
- 数据结构第七节(图(中))
- python应用(5):变量类型与数据结构
- 【数据结构】树链剖分详细讲解
- Redis数据结构之整数集合
- 数据结构与算法】 通俗易懂讲解 二叉搜索树查找
- 【数据结构与算法】 通俗易懂讲解 二叉树遍历
- 【数据结构与算法】 通俗易懂讲解 直接插入排序
- 【数据结构与算法】 通俗易懂讲解 选择排序