实验三:双向链表的基本操作
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;
}