实验四 栈和队列的基本操作

(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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值