c语言数据结构双向链表,C语言 数据结构双向链表简单实例

本文介绍了如何在C语言中实现双向链表的基本操作,包括创建链表、输出链表、删除元素、插入元素,以及特殊情况下对链表进行奇偶数排序并判断其对称性。通过实例展示了如何在有序链表中保持奇数在偶数之后,并验证链表是否满足对称条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//排序的时候因为没有说明奇数和偶数需不需要各自再排序,我就没有排序,只是将奇数放在偶数后面。

//创建链表的时候,因为这个实验没有要求输出链表的长度,所以我就输入了一个长度为n的链表。

#include

#include

structnode

{

intdata;

node *pre,*next;

}*h,*end;

voidCreatList()//创建一个双向链表

{

intn;

node *s,*e;

printf("请输入链表长度:    ");

scanf("%d",&n);

printf("请输入数据:      ");

h=(node *)malloc(sizeof(node));

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

h->pre=NULL;

e=h;

e->next=s;

s->pre=e;

while(n--)

{

e=s;

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

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

e->next=s;

s->pre=e;

}

s->next=NULL;

end=s;

return;

}

voidPrintList()//输出链表

{

node *s;

s=h->next;

printf("链表数据:       ");

while(s!=end)

{

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

s=s->next;

}

printf("\n");

return;

}

voidDeletList()//删除链表中的某个元素

{

intx;

intflag;

node *s,*e;

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

scanf("%d",&x);

s=h->next;

e=h;

flag=0;

while(s!=end)

{

if(s->data==x)

{

e->next=s->next;

s->next->pre=e;

free(s);

flag=1;

break;

}

e=s;

s=e->next;

}

if(!flag)

printf("链表中不存在值为%d的元素。\n",x);//如果链表中没有x,输出这句话。

return;

}

voidInsetList()//在有序链表中插入某个元素

{

intx;

node *s,*e;

printf("输入需要插入的元素:  ");

scanf("%d",&x);

s=h->next;

while(1)

{

if(s->data>=x)

{

e=(node *)malloc(sizeof(node));

e->data=x;

e->next=s;

e->pre=s->pre;

s->pre->next=e;

s->pre=e;

break;

}

elseif(s==end)//将x放入链表末尾

{

end=(node *)malloc(sizeof(node));

s->data=x;

end->pre=s;

end->next=NULL;

s->next=end;

break;

}

s=s->next;

}

return;

}

voidJudgeList()//判断双向链表是否对称

{

node *s,*e;

intflag=0;

s=h->next;

e=end->pre;

while(s->data==e->data&&s!=end&&e!=h)

{

s=s->next;

e=e->pre;

}

if(s==end&&e==h)

printf("链表对称。\n");

else

printf("链表不对称。\n");

return;

}

voidSortList()//将链表中的奇数放在偶数后面

{

node *s;

node *odd;

inttemp;

odd=h->next;

s=h->next;

while(s!=end)

{

if(s->data%2!=0)

{

temp=odd->data;

odd->data=s->data;

s->data=temp;

odd=odd->next;

s=s->next;

}

else

s=s->next;

}

return;

}

intPrintMenu()//打印目录

{

intT;

printf("******************目录******************\n");

printf("创建一个双向链表:           1\n");

printf("输出链表:               2\n");

printf("删除链表中的指定元素:         3\n");

printf("向链表中插入元素:           4\n");

printf("判断链表是否对称:           5\n");

printf("排列链表:               6\n");

printf("操作结束:               0\n");

printf("输入操作指令:     ");

scanf("%d",&T);

switch(T)

{

case1:CreatList();break;

case2:PrintList();break;

case3:DeletList();break;

case4:InsetList();break;

case5:JudgeList();break;

case6:SortList();break;

case0:return1;

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

}

return0;

}

intmain()

{

intflag;

while(1)

{

flag=PrintMenu();

if(flag)//通过flag控制循环的跳出

break;

}

printf("谢谢使用!\n");

return0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值