实验四 栈和队列的基本操作
2012-05-05 22:23 璋廊 阅读(643) 评论(0) 收藏 举报(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; }