双向循环链表的创建、查找、插入、删除和遍历等操作

双向循环链表的创建、查找、插入、删除和遍历等操作

#ifndef __DLINKLIST_H__
#define __DLINKLIST_H__
#include 
#include 

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;
}

你可能感兴趣的:(C语言数据结构)