您的位置:首页 > 其它

循环双向链表的基本操作

2016-03-10 14:24 399 查看
#include <iostream>
#include <cstdio>
#include <stdlib.h>
using namespace std;
typedef int ElemType;
typedef struct DulNode
{
ElemType data;
struct DulNode *prior;
struct DulNode *next;
}DulNode,*DuLinkList;
DuLinkList CreateDuLinkList(int n)
{
int x;
DulNode *h,*p;
h=(DulNode *)malloc(sizeof(DulNode));
h->next = h;
h->prior = h;
p=h;
printf("输入元素:");
while(n--)
{
scanf("%d",&x);
DulNode *l;
l=(DulNode *)malloc(sizeof(DulNode));
l->data=x;
p->next=l;
l->prior=p;
l->next = h;//l->next指向头结点
h->prior = l;
p=l;
}
return h;
}
void output(DuLinkList L)
{
DulNode *p;
for(p=L->next;p->next!=L->next;p=p->next)//终止条件为p->next不为头结点
{
printf("%d ",p->data);
}

}
void InsertDuLinkedList(DuLinkList L,int i,ElemType e)
{
int j;
DuLinkList p;
p=L;
j=1;
while(j<i)
{
p=p->next;
j++;
}
DulNode *s;
s=(DulNode *)malloc(sizeof(DulNode));
s->data = e;
s->prior = p;
p->next->prior = s;
s->next = p->next;
p->next = s;

}
void DeleteDuLinkList(DuLinkList L,int i)
{
int j;
DuLinkList p;
p=L;
j=1;
while(j<=i)
{
p=p->next;
j++;
}
p->prior->next = p->next;
p->next = p->prior;
free(p);

}
int CountDuLinkList(DuLinkList L)
{
int count=0;
DuLinkList p;
p=L;
while(p->next!=L)
{
count++;
p=p->next;
}
return count;
}
int main()
{
int n,i,x;
DuLinkList L;
printf("输入要创建的循环双向链表的长度:");
scanf("%d",&n);
L=CreateDuLinkList(n);
output(L);
printf("\n输入要插入的节点的位置和元素:");
scanf("%d %d",&i,&x);
InsertDuLinkedList(L,i,x);
output(L);
printf("\n输入要删除哪一位置上的元素:");
scanf("%d",&i);
DeleteDuLinkList(L,i);
output(L);
printf("\n当前链表的长度为%d",CountDuLinkList(L));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: