双向链表

来源:互联网 发布:常用的python ide 编辑:程序博客网 时间:2024/05/21 20:52

 

实验三:双向链表的基本操作

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

    2.遍历双向链表。

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

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

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

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

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

*******************************************************************************


#include<stdio.h>
#include<stdlib.h>

typedef struct Dulist{//双链表结点
 int data;
 struct Dulist *prior;
 struct Dulist *next;
}Dulist,*Dulinklist;

Dulinklist head,end;//头结点,尾结点

Dulinklist Create()//创建结点
{
 Dulinklist p;
 p=(Dulinklist)malloc(sizeof(Dulist));
 p->prior=NULL;
 p->next=NULL;
 return p;
}

void Endcreate()//1 建立一个带头结点的双链表
{
 Dulinklist q;
 int data;
 
 printf("请输入一个整数:");
    scanf("%d",&data);//读入数据
 q=Create();//开辟空间
 q->data=data;//录入
 end->next=q;//
 q->prior=end;//
 end=end->next;//尾插
}

 

void Dulistshow1()//顺序读出
{
 printf("双向链表为:\n");
 Dulinklist p;
 p=head->next;
 while(p)//不为空
 {
  printf("%d   ",p->data);
  p=p->next;
 }
 
}

void Dulistshow2()//逆序读出
{
 printf("双向链表为:\n");
 Dulinklist p;
 p=end;
 while(p->prior)
 {
  printf("%d   ",p->data);
  p=p->prior;
 }
 
}

void Dulistlength()//2 计算双链表的长度,然后输出双链表
{
 int count=0;
 Dulinklist p;
 p=head->next;
 while(p)
 {
  count++;
  p=p->next;
 }
 printf("双链表的长度为:%d\n",count);
 Dulistshow1();//调用顺序输出
}

void Dulistdelete()//3实现双向链表中删除一个指定元素

 printf("请输入要删除的元素:");
 int data;
 Dulinklist p;
 scanf("%d",&data);//输入要删除的数据
 p=head->next;
 while(p)
 {
  if(p->data==data)
  { 
   if(p->next==NULL)//判断最后一个,特别处理
   {
    p->prior->next=NULL;
    end=p->prior;//尾节点前移
    free(p);
    
    break;
   }
   p->prior->next=p->next;
   p->next->prior=p->prior;
   free(p);
   break;
  }
  p=p->next;
 }
 Dulistlength();
 
}
void Dulistinsert()//4在非递减有序双向链表中实现插入元素e仍有序算法

 int e;
 Dulinklist p,q;
 printf("请输入要插入的数据:");
 scanf("%d",&e);
 q=Create();
 q->data=e;//需要插入的节点
 p=head->next;
 
 if(end->data<e)//插入到最后
 { 
  end->next=q;
  q->prior=end;
  end=q;//尾指针后移
  Dulistlength();
  return;
 }
 while(p)
 {
  if(p->data>=e)
  {
   q->prior=p->prior;
   p->prior->next=q;
   q->next=p;
   p->prior=q;
   Dulistlength();
   return;
  }
  p=p->next;
 }   
}

int Dulistmirror()//5判断双向链表中元素是否对称若对称返回1否则返回0
{
 Dulinklist p,q;
 p=head->next;
 q=end;
 while(p&&q)
 {
  if(p->data!=q->data)
   return 0;
  p=p->next;
  q=q->prior;
 }
 return 1;
 
}

void Dulistjo()//6

 Dulinklist p,r,q,s;
 p=head->next;
 q=head;
 s=Create();
 r=s;
 while(p)
 {
  if(p->data%2==1)//奇数
  {
   q->next=p;
   p->prior=q;
   q=q->next;
  }
  else
  {
   r->next=p;
   p->prior=r;
   r=r->next;
   end=r;//控制为指针
  }
  p=p->next;
 }
 q->next=s->next;
 s->next->prior=q;//保证双向
 Dulistlength();

}


void tip()
{
 printf("***************菜单栏*****计科*陈东东**********\n");
 printf("1 建立一个带头结点的双链表\n");
 printf("2 计算双链表的长度,然后输出双链表\n");
 printf("3 实现双向链表中删除一个指定元素\n");
 printf("4 在非递减有序双向链表中实现插入元素e仍有序算法\n");
 printf("5 判断双向链表中元素是否对称若对称返回1否则返回0\n");
 printf("6 设元素为正整型,实现算法把所有奇数排列在偶数之前\n");
 printf("0 退出程序\n");
 printf("请输入你的选择:");
 
}

int main()
{
 
 head=Create();
 end=Create();
 end=head;//寻找关键所在
 int k;
 tip();
 while(scanf("%d",&k),k)
 {
  switch(k)
  {
  case 1:Endcreate(); printf("操作完毕\n");
   tip();
   
   break;
  case 2:Dulistlength();printf("操作完毕\n");
   tip();
   
   break;
  case 3:Dulistdelete();printf("操作完毕\n");
   tip();
   break; 
  case 4:Dulistinsert();printf("操作完毕\n");
   tip();
   break;
  case 5:printf("%d  ",Dulistmirror());printf("操作完毕\n");
   tip();
   break;
  case 6:Dulistjo();printf("操作完毕\n");
   tip();
   break;
  case 9:Dulistshow2();printf("操作完毕\n");//实现逆序,作为校准
   tip();
  }
 }
 
 return 0;
}