双向循环链表的创建、查找、插入、删除和遍历等操作
#ifndef __DLINKLIST_H__
#define __DLINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct double_link_node
{
datatype data;
struct double_link_node *prior,*next;
}dlk,*dplk;
extern void init_dlinklist(dplk *H);
extern void create_dlinklist(dplk p);
extern void search_dlinklist(dplk p,int pos,dplk *r);
extern void insert_dlinklist(dplk p,datatype val,int pos);
extern void delete_dlinklist(dplk p,int pos);
extern void show_dlinklist(dplk p);
extern void clear_dlinklist(dplk p);
#endif
#include "dlinklist.h"
//初始化
void init_dlinklist(dplk *H)
{
*H = (dplk)malloc(sizeof(dlk));
if(NULL == *H)
{
perror("Malloc failed");
exit(-1);
}
(*H)->prior = *H;
(*H)->next = *H;
}
//创建双向循环链表
void create_dlinklist(dplk p)
{
dplk q,r;
datatype val;
r = p;
while(1)
{
printf("Please input(-1 to exit):");
scanf("%d",&val);
if(-1 == val) break;
while(getchar() != '\n');
q = (dplk)malloc(sizeof(dlk));
if(NULL == q)
{
perror("Malloc failed");
exit(-1);
}
q->data = val;
q->prior = r;
q->next = r->next;
r->next = q;
p->prior = q;
r = q;
}
}
//位置搜索
void search_dlinklist(dplk p,int pos,dplk *r)
{
dplk t;
t = p;
int i = -1;
if(pos < 0)
{
printf("The pos is invalid\n");
*r = NULL;
return ;
}
while(p->next != t)
{
p = p->next;
i++;
if(i == pos)
{
*r = p;
return ;
}
}
*r = NULL;
return ;
}
//位置插入
void insert_dlinklist(dplk p,datatype val,int pos)
{
dplk q,r;
q = (dplk)malloc(sizeof(dlk));
if(NULL == q)
{
perror("Malloc failed");
exit(-1);
}
q->data = val;
search_dlinklist(p,pos,&r);
if(NULL == r)
{
printf("The pos is invalid\n");
return ;
}
q->next = r;
q->prior = r->prior;
r->prior->next = q;
r->prior = q;
return ;
}
//位置删除
void delete_dlinklist(dplk p,int pos)
{
dplk r;
search_dlinklist(p,pos,&r);
if(NULL == r)
{
printf("Not find pos:%d\n",pos);
return ;
}
r->prior->next = r->next;
r->next->prior = r->prior;
free(r);
}
//遍历
void show_dlinklist(dplk p)
{
dplk r;
r = p;
while(p->next != r)
{
printf("%d ",p->next->data);
p = p->next;
}
puts("");
}
//释放内存
void clear_dlinklist(dplk p)
{
dplk r,t;
r = p;
while(p->next != r)
{
t = p->next;
free(p);
p = t;
}
return ;
}
#include "dlinklist.h"
int main(int argc, const char *argv[])
{
dplk h,r;
init_dlinklist(&h);
create_dlinklist(h);
show_dlinklist(h);
search_dlinklist(h,4,&r);
if(NULL != r)
printf("%d\n",r->data);
insert_dlinklist(h,55,2);
show_dlinklist(h);
delete_dlinklist(h,2);
show_dlinklist(h);
clear_dlinklist(h);
return 0;
}
来源:CSDN
作者:Epley
链接:https://blog.csdn.net/m198984/article/details/103484551