第一章 单链表
第二章 双链表
第三章 栈
由上一张内容可知,我们知道了单链表是怎么样构成的,下面我们详细探究双链表是怎么样子的。我们单链表无论是头插法,还是尾插法,它都是由头结点开始才可以确定所有结点的位置,那么我们的双链表就无论从什么地方开始都可以确定所有链接结点的位置
typedef struct DulNode{
int data;
struct DulNode *prior;
struct DulNode *next;
}DulNode;
typedef DulNode *DLinkList;
DLinkList CreateHeadList(DLinkList L, int n){ // 头插法创建双链表
DLinkList p;
L = (DLinkList)malloc(sizeof(DulNode));
L->prior = NULL;
L->next = NULL;
for(int i=0; i<n; i++){
p = (DLinkList)malloc(sizeof(DulNode));
p->data = rand()%100 + 1;
p->prior = L;
p->next = L->next;
if(L->next){
L->next->prior = p;
}
L->next = p;
}
return L;
}
DLinkList CreateTailList(DLinkList L, int n){ // 尾插法创建双链表
DLinkList p,r;
L = (DLinkList)malloc(sizeof(DulNode));
r = L;
L->prior = NULL;
L->next = NULL;
for (int i=0; i<n; i++){
p = (DLinkList)malloc(sizeof(DulNode));
p->data = rand()%100 + 1;
p->prior = r; // 重点记忆--》相当于新创建的节点的前驱都是上一个节点(此时r是记录着
r->next = p; // 重点记忆
r = p; // 重点记忆
}
r->next = NULL;
return L;
}
void SetElem(DLinkList L, int value){ // 追加双链表元素
DLinkList p,s;
p = L;
s = (DLinkList)malloc(sizeof(DulNode));
s->prior = p;
s->data = value;
s->next = p->next;
p->next->prior = s;
L->next = s;
}
void InsertElem(DLinkList L, int n, int value){ // 插入节点
DLinkList p,s;
p = L;
int num = 1;
while(p && num<n){
p = p->next;
++num;
}
if(!p || num<n || n < 1){
printf("insert-fill-error\n");
} else{
s = (DLinkList)malloc(sizeof(DulNode));
s->prior = p;
s->data = value;
s->next = p->next;
p->next->prior = s; // 重点记忆,此时p->next里面记录的是原来的后继节点。
p->next = s; // 重点记忆,此时让p->next指向新节点;
printf("insert-OK\n");
}
}
void DelectElem(DLinkList L, int n){ // 删除元素
int num = 1;
DLinkList p;
p = L;
while (p && num<n){
p = p->next;
++num;
}
if (!(p->next) || num<n, n<1){
printf("Delect--no found--error!\n");
} else{
p->next->next->prior = p;
p->next = p->next->next;
printf("Delect--ok!\n");
}
}
void ClearList(DLinkList L){ // 清空列表
DLinkList p, s;
p = L->next;
while(p){
s = p->next;
free(p);
p = s;
}
L->next = NULL;
printf("Clear--ok!\n");
}
void GetElem(DLinkList L, int n){ // 查找元素
int num = 1;
DLinkList p;
p = L->next;
while (p && num<n){
p = p->next;
++num;
}
if(!p || num < n || n < 1){
printf("GetElem--fill--error\n");
} else{
printf("The Elem value=%d\n", p->data);
}
}
在这里插入代码片
DLinkList CreateHeadDList(DLinkList L, int n){ // 头插法创建循环双向链表
DLinkList p;
L = (DLinkList)malloc(sizeof(DulNode));
L->next = L;
L->data = -1;
L->prior = L;
for(int i=0; i<n; i++){
p = (DLinkList)malloc(sizeof(DulNode));
p->data = rand()%100 + 1;
p->next = L->next;
p->prior = L;
if(L->next){
L->next->prior = p;
}
L->next = p;
}
return L;
}
DLinkList CreateTailDList(DLinkList L, int n){ //尾插法创建循环双向链表
DLinkList p,r;
L = (DLinkList)malloc(sizeof(DulNode));
r = L;
L->prior = NULL;
L->data = -1;
L->next = NULL;
for (int i=0; i<n; i++){
p = (DLinkList)malloc(sizeof(DulNode));
p->data = rand()%100 + 1;
p->prior = r; // 重点记忆--》相当于新创建的节点的前驱都是上一个节点(此时r是记录着
r->next = p; // 重点记忆
r = p; // 重点记忆
}
r->next = L;
L->prior = r;
return L;
}
看不懂的,先去看看上一篇文章。