您的位置:首页 > 其它

双向循环链表--增删查操作

2017-09-29 21:31 525 查看
双向循环链表与单链表区别其实不多,对比之后就是多了几个操作步骤

#include <stdio.h>
#include <malloc.h>
typedef int Elemtype;
typedef struct LNode{
Elemtype data;
struct LNode *prior;
struct LNode *next;
}LNode,*LinkList;

LinkList MCreatlist_last(LinkList head,Elemtype n)//尾插法
{
LinkList p;
LinkList q;//尾指针
int i;
head=(LinkList)malloc(sizeof(LNode));
head->next=head;
head->prior=head;
q=head;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=q->next;
p->prior=q;
q->next=p;
q=p;
}
head->prior=q;
return head;
}
void InsertList(LinkList head,int i,int e)//插入
{
LinkList p,s;
int j=1;
p=head->next;
while(p!=head&&j<i)
{
p=p->next;
++j;
}
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
s->next->prior=s;
s->prior=p;
/* s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;*/
//  return head;
}

void deletelist(LinkList head,int i,int *e)//删除
{
LinkList p,q;
int j=1;
p=head->next;
while(p->next&&j<i)
{
p=p->next;
j++;
}
//p=(LinkList)malloc(sizeof(LNode));
// *e=p->data;
q=p;
p->prior->next=p->next;
p->next->prior=p->prior;
*e=q->data;
free(p);
}

int Getelem(LinkList head,int i)//得到
{
LinkList p;
int e;
int j=1;
p=head->next;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p->next||j>i)
return 0;
else{
e=p->next->data;
return e;
}
}
int main()
{
LinkList head,star;
int i=0;
int e;
int get;
head=MCreatlist_last(head,5);
/* star=head->next;
while(i<5)
{
printf("%d  ",star->data);
star=star->next;
++i;
}*/

/*InsertList(head,3,2);
star=head->next;
while(i<6)
{
printf("%d  ",star->data);
star=star->next;
++i;
}*/

deletelist(head,3,&e);
star=head->next;
while(i<4)
{
printf("%d  ",star->data);
star=star->next;
++i;
}
printf("\n%d\n",e);

get=Getelem(head,3);
printf("%d",get);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: