您的位置:首页 > 其它

双向链表

2015-10-21 13:26 791 查看
#include<stdio.h>

#include<malloc.h>

#include<windows.h>

typedef int elemtype;

typedef struct dnode

{

elemtype data;

struct dnode *prior;

struct dnode *next;

}dlinklist;

void createlistf(dlinklist *&L,elemtype a[],int n) //建立双链表(头插法)

{

dlinklist *s;

int i;

L=(dlinklist *)malloc(sizeof(dlinklist));

L->prior=L->next=NULL;

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

{

s=(dlinklist *)malloc(sizeof(dlinklist));

s->data=a[i];

s->next=L->next;

if(L->next!=NULL)

L->next->prior=s;

L->next=s;

s->prior=L;

}

}

void creatlistr(dlinklist *&L,elemtype a[],int n) //尾插法建表

{

dlinklist *s,*p;

int i;

L=(dlinklist *)malloc(sizeof(dlinklist));

L->prior=L->next=NULL;

p=L;

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

{

s=(dlinklist *)malloc(sizeof(dlinklist));

s->data=a[i];

s->next=p->next;

p->next=s;

s->prior=p;

p=s;

s=p->next;

}

}

void listempty(dlinklist *L) //判断是否为空

{

if(L->next!=NULL)

printf("链表不为空\n");

else

printf("链表为空\n");

}

int listlength(dlinklist *L) //求链表长度

{

dlinklist *p=L;

int i=0;

while(p!=NULL)

{

i++;

p=p->next;

}

return i-1;

}

void listinsert(dlinklist *&L) //插入元素

{

dlinklist *p=L,*s;

int i,m,a;

printf("请输入需插入元素");

scanf("%d",&a);

printf("请输入需插入元素位置");

scanf("%d",&m);

if(m<0||m>listlength(L))

printf("输入错误\n");

else

{

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

p=p->next;

s=(dlinklist *)malloc(sizeof(dlinklist));

s->data=a;

s->next=p->next;

s->next->prior=s;

p->next=s;

s->prior=p;

printf("插入成功\n");

}

}

void listdelete(dlinklist *&L) //删除元素

{

dlinklist *p=L,*q;

int i,m,t;

printf("请输入需删除元素位置 ");

scanf("%d",&m);

if(m<0||m>listlength(L))

printf("输入错误\n");

else

{

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

p=p->next;

q=p->next;

p->next=q->next;

q->next->prior=p;

t=q->data;

free(q);

printf("成功删除元素%d\n",t);

}

}

void getelem(dlinklist *L) //取值

{

dlinklist *p=L;

int i=0,m;

printf("请输入取值元素 ");

scanf("%d",&m);

while(p!=NULL)

{

if(p->data==m)

printf("取值成功 %d元素在第%d位\n",m,i);

p=p->next;

i++;

}

if(p=NULL)

printf("没有此元素\n");

}

void locateelem(dlinklist *L) //查找

{

dlinklist *p=L;

int i=0,m;

printf("请输入需查找位置 ");

scanf("%d",&m);

if(m<=0||m>listlength(L))

printf("输入错误\n");

else

{

for(;i<m;i++)

p=p->next;

printf("第%d位的元素为%d\n",m,p->data);

}

}

void destroylist(dlinklist *&L) //销毁链表

{

dlinklist *p=L,*q;

char m;

getchar();

printf("确认要销毁链表请输入y否则不销毁 请输入:");

scanf("%c",&m);

if(m=='y')

{

q=p->next;

while(q!=NULL)

{

free(p);

p=q;

q=p->next;

}

free(p);

printf("链表已销毁\n");

exit(0);

}

printf("链表未销毁\n");

}

void displist(dlinklist *L) //输出双链表

{

dlinklist *s;

s=L->next;

while(s!=NULL)

{

printf(" %d",s->data);

s=s->next;

}

printf("\n");

}

void
main()

{

printf(" ****************欢迎使用双链表基本运算系统****************\n");

printf(" ****************如有问题欢迎和我联系*****************\n");

dlinklist *p;

int a[5],i,m,t;

printf("请选择建表方式 1用头插法建表,2用尾插法建表 ");

scanf("%d",&t);

printf("请输入5个数\n");

for(i=0;i<5;i++)

scanf("%d",&a[i]);

if(t==1)

createlistf(p,a,5);

else if(t==2)

creatlistr(p,a,5);

else

printf("输入错误!");

printf("双链表建立完毕\n");

while(1)

{

printf("请选择:");

printf(" 1.输出链表\n");

printf(" 2.判断线性表(双链表)是否为空\n");

printf(" 3.求线性表(双链表)的长度\n");

printf(" 4.从线性表(双链表)中取值\n");

printf(" 5.在线性表(双链表)中查找元素\n");

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

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

printf(" 8.销毁链表\n");

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

scanf("%d",&m);

switch(m)

{ case 1:displist(p);break;

case 2:listempty(p);break;

case 3: printf("链表长为:%d\n",listlength(p));break;

case 4:getelem(p);break;

case 5:locateelem(p);break;

case 6:listinsert(p);break;

case 7:listdelete(p);break;

case 8:destroylist(p);break;

case 9:exit(0);

default:printf("输入错误,请重新输入\n");

}

}

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