一聚教程网:一个值得你收藏的教程网站

热门教程

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

时间:2022-06-25 04:37:22 编辑:袖梨 来源:一聚教程网

双向链表的基本操作

    1.利用尾插法建立一个双向链表。

    2.遍历双向链表。

    3.实现双向链表中删除一个指定元素。

    4.在非递减有序双向链表中实现插入元素e仍有序算法。

    5.判断双向链表中元素是否对称若对称返回1否则返回0。

    6.设元素为正整型,实现算法把所有奇数排列在偶数之前。

    7.在主函数中设计一个简单的菜单调试上述算法。

实例代码:

 

 代码如下 复制代码

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

//创建链表的时候,因为这个实验没有要求输出链表的长度,所以我就输入了一个长度为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("创建一个双向链表:           1n");

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

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

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

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

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

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

 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;

}

 

热门栏目