實驗四 棧和佇列的基本操作

Claire_ljy發表於2020-04-04

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





	
	

  

轉載於:https://www.cnblogs.com/liyongqiang/archive/2012/05/05/2485358.html

相關文章