1.概念:
带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表
数据结构
,都是带头
双向循环链表。另外这个链表虽然结构复杂,但是使用代码实现以后会发现能带来很多优势。
2.对双向循环链表的操作:
(1)
动态申请一个结点
(2)
创建头结点进行初始化
(3)
尾插法
(4)
尾删法
(5)
头插法
(6)
头删法
(7)
查找元素
(8)
在
pos
位置前进行插入
(9)
删除
pos
位置的结点
(10)
打印数据
示例如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node{
struct node *prev;
struct node *next;
int data;
}Node;
Node *buylistnode(int data){
Node *newnode=(Node *)malloc(sizeof(Node));
if(newnode==NULL){
printf("malloc error");
exit(-1);
}
newnode->prev=newnode->next=NULL;
newnode->data=data;
return newnode;
}
Node *listinit(){
Node *plist=buylistnode(0);
plist->prev=plist->next=plist;
return plist;
}
void listpushback(Node *plist,int data){
if(plist==NULL){
printf("This list is empty.\n");
return;
}
Node *newnode=buylistnode(data);
Node *tail=plist->prev;
tail->next=newnode;
newnode->prev=tail;
newnode->next=plist;
plist->prev=newnode;
}
void listpopback(Node *plist){
if(plist==NULL){
printf("This list is empty.\n");
return;
}
if(plist->next!=plist){
printf("This list is not only head.\n");
}
Node *tail=plist->prev;
Node *tailprev=tail->prev;
tailprev->next=plist;
plist->prev=tailprev;
free(tail);
tail=NULL;
}
void listpushfront(Node *plist,int data){
if(plist==NULL){
printf("This list is empty.\n");
}
Node *newnode=buylistnode(data);
Node *first=plist->next;
plist->next=newnode;
newnode->prev=plist;
newnode->next=first;
first->prev=newnode;
}
void listpopfront(Node *plist){
if(plist==NULL){
printf("This list is empty.\n");
return;
}
if(plist->next!=plist){
printf("List is not only head\n");
}
Node *first=plist->next;
Node *second=first->next;
plist->next=second;
second->prev=plist;
free(first);
first=NULL;
}
Node *listfind(Node *plist,int data){
if(plist==NULL){
printf("This list is empty.\n");
return NULL;
}
Node *cur=plist->next;
while(cur!=plist){
if(cur->data==data){
return cur;
}
cur=cur->next;
}
return NULL;
}
void listinsert(Node *pos,int data){
if(pos==NULL){
printf("List is empty.\n");
return;
}
Node *newnode=buylistnode(data);
Node *posprev=pos->prev;
posprev->next=newnode;
newnode->prev=posprev;
newnode->next=pos;
pos->prev=newnode;
}
void listerase(Node *pos){
if(pos==NULL){
printf("List is empty.\n");
return;
}
Node *posprev=pos->prev;
Node *posnext=pos->next;
posprev->next=posnext;
posnext->prev=posprev;
free(pos);
pos=NULL;
}
void listprint(Node *plist){
if(plist==NULL){
printf("List is empty.\n");
return;
}
Node *cur=plist->next;
while(cur!=plist){
if(cur->next==plist){
printf("%d",cur->data);
}else{
printf("%d<->",cur->data);
}
cur=cur->next;
}
printf("\n");
}
void testlist01(){
Node *plist=listinit();
listpushback(plist,1);
listpushback(plist,2);
listpushback(plist,3);
listpushback(plist,4);
listprint(plist);
listpopback(plist);
listpopback(plist);
listpopback(plist);
listpopback(plist);
listprint(plist);
listpushfront(plist,1);
listpushfront(plist,2);
listpushfront(plist,3);
listpushfront(plist,4);
listprint(plist);
listpopfront(plist);
listpopfront(plist);
listpopfront(plist);
listpopfront(plist);
listprint(plist);
}
void testlist02(){
Node *plist=listinit();
listpushback(plist,1);
listpushback(plist,1);
listpushback(plist,1);
listpushback(plist,1);
listprint(plist);
Node *pos=listfind(plist,3);
listinsert(pos,30);
listprint(plist);
listerase(pos);
listprint(plist);
}
int main(){
testlist01();
testlist02();
}
结果如下: