数据结构——双向循环链表的简单实现

//双循环链表的实现
 #include <stdio.h>
#include <stdlib.h> 
typedef struct LNode{
	int data;
	struct LNode *prior,*next;
}LNode,*LinkList;

//判空函数
bool Empty(LinkList &L){
	if(L->next == L->prior)
		return true;
	return false;	
} 

//双链表输出函数
bool LinkList_Output(LinkList &L){
	LinkList head = L->next;
	LinkList flag = L;
	if(Empty(head)){
		printf("链表为空!\n");
		return false;
	}
	printf("正序输出(正向遍历)结果:");
	while(head!=flag){
		printf("%3d",head->data);
		head = head->next;
	}
	head = L->prior;
	flag = L;
	printf("\n倒序输出(逆向遍历)结果:");
	while(head!=flag){
		printf("%3d",head->data);
		head = head->prior;
	}
	printf("\n");
	return true;
} 

//双链表建立函数 
LinkList List_Insert(LinkList &L){
	LNode *q,*p;int x,n;
	L = (LinkList)malloc(sizeof(LNode));
	L->next = L;
	L->prior = L;
	p = L;
	printf("请输入需要创建双向链表元素的个数:");
	scanf("%d",&n);
	printf("请依次输入双链表的值:\n");
	for(int i = 0;i < n;i++){
		scanf("%d",&x);
		q = (LNode*)malloc(sizeof(LNode));
		q->data = x;
		p->next = q;
		q->prior = p;
		L->prior = q;
		q->next = L;
		p = q;
	}
	return L;
} 

//按照序号查找结点值
LNode *GetElem(LinkList L,int i){
//本算法取出单链表L(带头结点)中第i个位置的结点指针
	 int j = 1;
	 LNode *p = L->next;
	 if(i == 0)
	 	return L;
	if(i < 1)
	return NULL;
	while(p&&j<i){
		p=p->next;
		j++;
	} 
	return p;
}

//按照值查找表结点
LNode *LocateElem(LinkList L,int e){
	LNode *p = L->next;
	while(p!=NULL&&p->data != e)
		p = p->next;
	return p;
}

//插入结点函数
bool LinkList_Insert(LinkList L,int i,int e){
	LNode* p = L->next;
	LNode* q = (LNode*)malloc(sizeof(LNode));
	p = GetElem(L,i - 1);
	q->data = e;
	q->next = p->next;
	p->next->prior = q;
	q->prior = p;
	p->next = q;
}

//删除结点函数
bool LinkList_Delete(LinkList L,int i){
	LinkList p = GetElem(L,i - 1);
	LinkList q = p->next;
	p->next = q->next;
	q->next->prior = p;
	free(q);
} 

//求表长函数
int LinkList_GetLength(LinkList L){
	int length = 0;
	LinkList flag = L->prior;
	while(!Empty(L)&&L!=flag){
		length++;
		L=L->next;
	}
	return length;
}

int main(){
	LinkList list;
	int i,result,e;
	LinkList node;
	LNode *s;
	List_Insert(list);
	printf("输出结果:\n");
	LinkList_Output(list);
	printf("按序号查找结点的值:\n");
	scanf("%d",&i);
	node = GetElem(list,i);
	printf("结果是%d\n",node->data); 
	printf("按值查找结点:\n");
	scanf("%d",&i);
	node = LocateElem(list,i);
	printf("结果是%d\n",node->data); 
	printf("请输入要插入的新结点和位置:\n");
	scanf("%d",&e);
	scanf("%d",&i);
	LinkList_Insert(list,i,e);
	LinkList_Output(list);
	printf("请输出要删除结点的位置:\n");
	scanf("%d",&i);
	LinkList_Delete(list,i);
	printf("结果是:\n");
	LinkList_Output(list);
	printf("表长是:%d",LinkList_GetLength(list));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39316701/article/details/101293413