双向循环链表
双向循环链表的时间效率很高,当然,用空间换的
双向循环链表 | 时间复杂度 |
---|
查找头结点 | O(1) |
查找尾结点 | O(1) |
查找第 i 个结点的前驱结点 | O(1) |
双向循环链表示意图
双向循环链表的定义
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Elemtype;
typedef struct Dulnode {
Elemtype data;
struct Dulnode* prior;
struct Dulnode* next;
}Dulnode;
typedef struct Dulnode* Dulinklist;
初始化
int Initlist(Dulinklist* L)
{
(*L) = (Dulinklist)malloc(sizeof(Dulnode));
if ((*L) == NULL) exit(-1);
(*L)->prior = (*L)->next = (*L);
return OK;
}
头插法
int Listhead(Dulinklist* L, int i)
{
int j,data;
for (j = 1; j <= i; j++)
{
Dulinklist p = (Dulinklist)malloc(sizeof(Dulnode));
Dulinklist first = (*L)->next;
scanf("%d", &data);
p->data = data;
p->next = first;
first->prior = p;
(*L)->next = p;
p->prior = (*L);
}
return OK;
}
尾插法
int Listtail(Dulinklist* L, int i)
{
int j, data;
for (j = 1; j <= i; j++)
{
Dulinklist p = (Dulinklist)malloc(sizeof(Dulnode));
Dulinklist tail = (*L)->prior;
scanf("%d", &data);
p->data = data;
tail->next = p;
p->prior = tail;
(*L)->prior = p;
p->next = (*L);
}
return OK;
}
在第i个结点前插入一个结点
int Insertlist(Dulinklist* L, int i)
{
Dulinklist place = (*L);
int j = 0;
while (place->next != (*L) && j < i - 1)
{
place = place->next;
j++;
}
if (place->next == (*L) || j > i - 1) return ERROR;
Dulinklist p = (Dulinklist)malloc(sizeof(Dulnode));
Dulinklist placei_ = place->next;
int data;
scanf("%d", &data);
p->data = data;
p->prior = place;
place->next = p;
p->next = placei_;
placei_->prior = p;
return OK;
}
删除第 i 个结点
int Deletelist(Dulinklist* L, int i, Elemtype *e)
{
Dulinklist place = (*L);
int j = 0;
while (place->next != (*L) && j < i - 1)
{
place = place->next;
j++;
}
if (place->next == (*L) || j > i - 1) return ERROR;
Dulinklist placei_ = place->next;
*e = placei_->data;
place->next = placei_->next;
placei_->next->prior = place;
free(placei_);
return OK;
}
总结
– | – | – | – | – | – | – | – | – | – | 单链表 | 静态链表 | 循环链表 | 双向链表 |
---|