//双循环链表的实现
#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
今日推荐
周排行