(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;
}