不是循环链表的双向链表
1.利用尾插法建立一个双向链表。
2.遍历双向链表。
3.实现双向链表中删除一个指定元素。
4.在非递减有序双向链表中实现插入元素e仍有序算法。
5.判断双向链表中元素是否对称若对称返回1否则返回0。
6.设元素为正整型,实现算法把所有奇数排列在偶数之前。
7.在主函数中设计一个简单的菜单调试上述算法。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define Maxsize 100
using namespace std;
typedef int Elemtype;
typedef struct node
{
int data;
struct node *pre,*next;
}dnode,*dlistlink;
dlistlink creat_dlist()//建立带头节点双向链表
{
dlistlink L,p,q;
L=(dnode *)malloc(sizeof(dnode));
L->pre=NULL;
q=L;
int x;
printf("please enter x:\n");
scanf("%d",&x);
while(x!=0)
{
p=(dnode *)malloc(sizeof(dnode));
if(p==NULL)
return 0;
p->data=x;
q->next=p;
p->pre=q;
q=p;
scanf("%d",&x);
}
q->next=NULL;
return L;
}
void display(dlistlink L)//遍历带头节点双链表
{
dlistlink p;
p=L->next;
printf("遍历结果为:\n");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int delete_dlist(dlistlink L,int e)//删除双链表中的一个指定元素
{
dlistlink p;
p=L->next;
while(p!=NULL)
{
if(p->data==e)
{
p->pre->next=p->next;
p->next->pre=p->pre;
return 1;
}
else
p=p->next;
}
return 0;
}
int Insertdnode(dlistlink L,int e)//插入指定元素在非递减有序双链表中
{
dlistlink p,q;
p=L->next;
while(p!=NULL)
{
if(p->data>=e)
p=p->next;
else
break;
}
p=p->pre;
q=(dnode *)malloc(sizeof(dnode));
if(q==NULL)
return 0;
q->data=e;
q->next=p->next;
p->next=q;
q->pre=p;
q->next->pre=q;
return 1;
}
int dlist_duicheng(dlistlink h)//判断双向链表是否对称
{
dlistlink p,q;
p=h->next;
q=h->next;int i=1;
while(q->next!=NULL)
{
q=q->next; i++;
}
if(i%2)
{
while(p!=q)
{
if(p->data!=q->data)
return 0;
p=p->next;
q=q->pre;
}
}
else
{
while(p->next!=q)
{
if(p->data!=q->data)
return 0;
p=p->next;
q=q->pre;
}
if(p->data==q->data)
return 1;
}
return 1;
}
void odd_dlist(dlistlink h)//实现所有的奇数都排在偶数前面
{
dlistlink p,q;
p=h->next;
while(p!=NULL)
{
if(p->data%2!=0)
{
q=p->next;
if(p->next!=NULL)
{
p->next->pre = p->pre;
p->pre->next = p->next;
}
else
p->pre->next=NULL; //删除
p->next=h->next;
h->next->pre=p;
p->pre=h;
h->next=p;//插到头结点后面
p=q;
}
else
p=p->next;
}
}
void init()
{
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("请选择操作序号:\n");
}
int main()
{
init();
dlistlink h;
int n,t,s,flag=1;
while(~scanf("%d",&n))
{
switch(n)
{
case 1: h=creat_dlist();break;
case 2: display(h); break;
case 3:printf("请输入要删除的数:\n");
scanf("%d",&t);
if(delete_dlist(h,t))
printf("删除成功\n");
else
printf("删除失败\n");
break;
case 4:printf("请输入要插入的数:\n");
scanf("%d",&t);
if(Insertdnode(h,t))
{
printf("插入成功,结果为:\n");
display(h);
}
else
printf("插入失败\n");
break;
case 5:if(dlist_duicheng(h))
printf("该链表对称\n");
else
printf("该链表不对称\n"); break;
case 6:odd_dlist(h);
display(h);
break;
case 0:flag=0;break;
}
if(flag==0)
break;
}
return 0;
}