(1)采用链式存储实现栈的初始化、入栈、出栈操作。
(2)采用顺序存储实现栈的初始化、入栈、出栈操作。
(3)采用链式存储实现队列的初始化、入队、出队操作。
(4)采用顺序存储实现循环队列的初始化、入队、出队操作。
(5)在主函数中设计一个简单的菜单,分别测试上述算法。
#include<stdio.h>
#include<stdlib.h>
typedef struct point //建立结构体
{
int data;
struct point *right,*left;
}Link,*List;
List built(int n)//建立链表;
{
List h,p,s;
int i,x;
h=(List)malloc(sizeof(Link));
s=h;
s->left=NULL;
for(i=1;i<=n;i++)
{
p=(List)malloc(sizeof(Link));
scanf("%d",&x);
s->right=p;
p->data=x;
p->left=s;
s=p;
}
p->right=NULL;
return h;
}
void print(List head)//输出链表;
{
List p;
p=head->right;
while(p)
{
printf("%d ",p->data);
p=p->right;
}
printf("\n");
}
void Delete(List head,int x)//删除值为x的元素;
{
//int i;
List p,q;
p=head->right;
while(p)
{
if(p->data==x)
{
q=p;
p->left->right=p->right;
p=p->right;
if(p)
p->left=q->left;
free(q);
}
else
p=p->right;
}
}
void Insert(List h,int x)//在非递减链表中插入x;
{
int flag=0;
List p,q,s;
s=(List)malloc(sizeof(Link));
s->data=x;
s->left=NULL;
s->right=NULL;
p=h->right;
q=h;
while(p)
{
if(p->data>x)
{
s->right=p;
//q=p->left;
s->left=q;
q->right=s;
p->left=s;
flag=1;
break;
}
q=q->right;
p=p->right;
}
if(!flag)
{
q->right=s;
s->left=q;
s->right=NULL;
}
}
int duic(List h,int n)//判断是否对称;
{
int i=1;
List p,q;
p=h->right;
if(n<=1)
return 1;
if(n%2==0)//偶数时
{
while(i<n/2)
{
i++;
p=p->right;
}
q=p->right;
while(q)
{
if(p->data!=q->data)
{
return 0;
}
q=q->right;
p=p->left;
}
}
else//奇数时
{
while(i<n/2)
{
i++;
p=p->right;
}
q=p->right->right;
while(q)
{
if(q->data!=p->data)
return 0;
p=p->left;
q=q->right;
}
}
return 1;
}
void SSort(List head)//把链表的奇数在前偶数在后;
{
List p,q,s,h;
p=head->right;
q=head;
h=(List)malloc(sizeof(Link));
h->left=NULL;
h->right=NULL;
s=h;
while(p)
{
if(p->data%2==0)
{
s->right=p;
q->right=p->right;
p->left=s;
p=p->right;
s=s->right;
}
else {
p=p->right;
q=q->right;
}
}
q->right=h->right;
s->right=NULL;
}
int main()
{
int n,x,a,flag=0;
List head,h,h1,h2;
while(1)
{
printf("******************************************************************\n");
printf("\t\t输入 0 表示退出程序!\n");
printf("\t\t输入 1 表示建立双链表!\n");
printf("\t\t输入 2 遍历双链表!\n");
printf("\t\t输入 3 删除指定的元素!\n");
printf("\t\t输入 4 在非递减有序双向链表中实现插入元素x仍有序\n");
printf("\t\t输入 5 判断双向链表中元素是否对称、\n");
printf("\t\t输入 6 把所有奇数排列在偶数之前。\n");
printf("******************************************************************\n");
printf("输入一个整数选择菜单!\n");
scanf("%d",&a);
switch (a)
{
case 0:return 0;
case 1:
{
flag=1;
printf("输入一个数n\n");
scanf("%d",&n);
printf("随机输入n个数、\n");
head=built(n);
}break;
case 2:{
if(flag==0)
{
printf("请先建立双链表!、\n");
break;
}
printf("输出链表元素!\n");
print(head);
}break;
case 3:
{
if(flag==0)
{
printf("请先建立双链表!、\n");
break;
}
printf("输入一个数x,表示删除链表的值为x的元素!\n");
scanf("%d",&x);
Delete(head,x);
printf("输出删除后的链表!\n");
print(head);
}break;
case 4:
{
printf("另外建一个非递减链表输入一个n\n");
scanf("%d",&n);
printf("s输入n个非递减的数\n");
h=built(n);
printf("输入要插入的元素\n");
scanf("%d",&x);
Insert(h,x);
printf("输出插入后的链表!\n");
print(h);
}break;
case 5:
{
printf("输入一个数n表示链表的长度!\n");
scanf("%d",&n);
printf("输入n个数!\n");
h1=built(n);
int k=duic(h1,n);
print(h1);
if(k)
{
printf("是对称链表!\n");
}
else {
printf("不是对称链表!\n");
}
}break;
case 6:
{
printf("输入一个数n\n");
scanf("%d",&n);
h2=built(n);
SSort(h2);
printf("奇数在前偶数在后!\n");
print(h2);
}break;
default:printf("请输入合法数字!\n");
}
}
return 0;
}