您的位置:首页 > 其它

双向循环链表的创建,插入与删除。

2013-08-02 22:20 302 查看
#include<stdio.h>

#include<malloc.h>

//=============================

//线性表的双向链表存储结构

//=============================

typedef int ElemType;

typedef int Status;

typedef struct DuLNode

{

ElemType data;

struct DuLNode *prior;

struct DuLNode *next;

}DuLNode,*DuLinkList;

//============================

//链表的长度

//============================

int length(DuLinkList l)

{

int i=0;

DuLinkList p;

p=l->next;

while(p!=l)

{

i++;

p=p->next;

}

return i;

}

//============================

//创建双向循环链表

//============================

DuLinkList create(DuLinkList l)

{

int i,n;

DuLinkList newbase;

printf("请输入双向循环链表结点的个数:");

scanf("%d",&n);

l=(DuLinkList)malloc(sizeof(DuLNode));

if(!l)

printf("内存分配失败!!!\n");

l->prior=l->next=l;

for(i=1;i<=n;i++)

{

newbase=(DuLinkList)malloc(sizeof(DuLNode));

printf("请输入第%d个结点的值:\n",i);

scanf("%d",&newbase->data);

newbase->prior=l;

newbase->next=l->next;

l->next->prior=newbase;

l->next=newbase;

}

return l;

}

//============================

//(正序输出)打印函数

//============================

void print1(DuLinkList l)

{

DuLinkList p;

p=l->next;

printf("双向循环链表的链表结点值是:\n");

while(p!=l)

{

printf("%d\t",p->data);

p=p->next;

}

}

//============================

//(逆序输出)打印函数

//============================

void print2(DuLinkList l)

{

DuLinkList p;

p=l->prior;

printf("双向循环链表的链表结点值是:\n");

while(p!=l)

{

printf("%d\t",p->data);

p=p->prior;

}

}

//=============================

//在第i个位置之前插入元素e

//=============================

DuLinkList ListInsert(DuLinkList l,int i,ElemType e)

{

int m;

DuLinkList newbase,p;

p=l;

if(i<1||i>length(l))

printf("你输入的结点位置错误!!!\n");

else

{

newbase=(DuLinkList)malloc(sizeof(DuLNode));

if(!newbase)

printf("内存分配失败!!!\n");

for(m=1;m<=i;m++)

{

p=p->next;

}

if(i==1)

{

newbase->data=e;

newbase->next=l;

newbase->prior=l->prior;

l->prior=newbase;

l->prior->next=newbase;

}

else

{

newbase->data=e;

newbase->prior=p->prior;

p->prior->next=newbase;

newbase->next=p;

p->prior=newbase;

}

}

return l;

}

//=============================

//删除函数

//=============================

DuLinkList ListDelete(DuLinkList l,int i,ElemType &e)

{

int m;

DuLinkList p;

p=l;

if(i<1||i>length(l))

printf("你输入的结点位置错误!!!\n");

for(m=1;m<=i;m++)

{

p=p->next;

}

e=p->data;

p->prior->next=p->next;

p->next->prior=p->prior;

free(p);

return l;

}

//=============================

//主函数

//=============================

void main()

{

int i,j,m,n,c;

DuLinkList head,l;

do{

printf("\n=======================================\n");

printf("\n1.创建双向循环链表\n");

printf("\n2.插入元素\n");

printf("\n3.删除元素\n");

printf("\n4.退出\n");

printf("\n=======================================\n");

printf("请选择你要操作的序号:\n");

scanf("%d",&c);

switch(c)

{

case 1:

{

head=create(l);

printf("\n正序输出:\n");

print1(head);

printf("\n逆序输出\n");

print2(head);

break;

}

case 2:

{

printf("\n请输入你要插入的元素的位置及元素的值:\n");

scanf("%d%d",&i,&j);

head=ListInsert(head,i,j);

print1(head);

break;

}

case 3:

{

printf("\n请输入你要删除的元素的位置:\n");

scanf("%d",&m);

ListDelete(head,m,n);

printf("\n你要删除的元素是:%d\n",n);

print1(head);

break;

}

case 4:

{

c=0;

break;

}

default :

{

printf("对不起,您输入的选项有误,请重新输入:\n");

break;

}

}

}

while(c!=0);

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