#include<stdio.h>#include<stdlib.h>// 函数结果状态码#define OK 1#define ERROR 0#define OVERFLOW -2typedefint Status;// Status是函数返回值类型,其值是函数结果状态码#define MAXSIZE 1024 // 顺序表可能达到的最大长度typedefint ElemType;// 元素数据类型typedefstruct{
ElemType *elem;// 指向数据元素的基地址int length;// 当前长度}SqList;// 顺序表/* 顺序表基本操作,序号i从1开始 */// 销毁voiddestroyList(SqList &L){free(L.elem);
L.elem =NULL;}// 根据用户输入,创建n个元素的表
Status createList(SqList &L,int n){
L.elem = new ElemType[MAXSIZE];if(!L.elem)exit(OVERFLOW);for(int i =1; i <= n; i++)scanf("%d",&L.elem[i]);
L.length = n;return OK;}// 遍历,打印表中元素 voidtraverseList(SqList L){for(int i =1; i <= L.length; i++)printf("%d ",L.elem[i]);}// 取值,将序号i的元素存入e
Status getElem(SqList L,int i, ElemType &e){if(i <1|| i > L.length)return ERROR;
e = L.elem[i];return OK;}// 查找,返回元素e的序号 intlocateElem(SqList L, ElemType e){for(int i =1; i <= L.length; i++)if(L.elem[i]== e)return i;return0;}// 插入
Status listInsert(SqList &L,int i, ElemType e){if((i <1)||(i > L.length +1))return ERROR;if(L.length == MAXSIZE)return ERROR;for(int j = L.length; j >= i; j--)
L.elem[j+1]= L.elem[j];
L.elem[i]= e;++L.length;return OK;}// 删除
Status listDelete(SqList &L,int i){if((i <1)||(i > L.length))return ERROR;for(int j = i; j <= L.length -1; j++)
L.elem[j]= L.elem[j+1];--L.length;return OK;}intmain(){
SqList list;int e, n, m;scanf("%d",&n);createList(list,n);scanf("%d",&m);if(getElem(list,m,e)== OK){//把 e 赋值为链表里的第 m 个数 printf("The value of e is %d\n",e);}else{printf("There is no m number in the list.\n");}scanf("%d",&e);if(locateElem(list,e)){printf("The index of %d is %d\n",e,locateElem(list,e));}else{printf("There is no number %d in the list.\n",e);}scanf("%d %d",&m,&e);// 插入元素 e 到第 m 个位置 if(listInsert(list,m,e)== OK){traverseList(list);}else{printf("Insert Error\n");}scanf("%d",&m);// 删除第 m 个元素 if(listDelete(list,m)== OK){traverseList(list);}else{printf("Delete Error\n");}destroyList(list);}
链表:
#include<stdio.h>#include<stdlib.h>// 函数结果状态码#define OK 1#define ERROR 0#define OVERFLOW -2typedefint Status;// Status是函数返回值类型,其值是函数结果状态码typedefint ElemType;// 元素数据类型 typedefstruct LNode
{
ElemType data;// 数据域struct LNode *next;// 指针域}LNode,*LinkList;/* 基本操作,序号i从1开始 */// 遍历,打印表中元素
Status createList(LinkList &L,int n){
L = new LNode;
L->next =NULL;
LNode *r = L;for(int i =0; i < n; i++){
LNode *p = new LNode;scanf("%d",&p->data);
p->next =NULL;
r->next = p;
r = p;}}
Status getElem(LinkList L,int i, ElemType &e){
LNode *p = L->next;int j =1;while(p && j < i){
p = p->next;++j;}if(!p || j > i)return ERROR;
e = p->data;return OK;}intlocateElem(LinkList L, ElemType e){
LNode *p = L->next;int i =1;while(p && p->data != e){
i++;
p = p->next;}if(!p)return0;return i;}
Status listInsert(LinkList &L,int i, ElemType e){
LNode *p = L;int j =0;while(p &&(j < i -1)){
p = p->next;++j;}if(!p || j > i -1)return ERROR;
LNode *s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;return OK;}
Status listDelete(LinkList &L,int i){
LNode *p = L;int j =0;while((p->next)&&(j < i -1)){
p = p->next;++j;}if(!(p->next)||(j > i -1))return ERROR;
LNode *q = p->next;
p->next = q->next;
delete q;return OK;}voidtraverseList(LinkList L){
LNode *p = L->next;while(p){printf("%d ",p->data);
p = p->next;}printf("\n");}intmain(){
LinkList list;int cmd, result, e, n, i;scanf("%d",&n);createList(list, n);while(~scanf("%d",&cmd)&& cmd!=-1){// 选择操作 switch(cmd){case0:// 取值scanf("%d",&i);
result =getElem(list, i, e);if(result)printf("%d\n", e);elseprintf("Failed\n");break;case1:// 查找scanf("%d",&e);
result =locateElem(list, e);if(result)printf("%d\n", result);elseprintf("Failed\n");break;case2:// 显示 traverseList(list);break;case3:// 插入 scanf("%d%d",&i,&e);
result =listInsert(list, i, e);if(result)printf("Succeed\n");elseprintf("Failed\n");break;case4:// 删除 scanf("%d",&i);
result =listDelete(list, i);if(result)printf("Succeed\n");elseprintf("Failed\n");break;default:printf("Unknown Command.\n");break;}}return0;}
顺序栈:
#include<stdio.h>#include<stdlib.h>// 函数结果状态码 typedefint Status;#define OK 1#define ERROR 0#define OVERFLOW -2#define MAXSIZE 10 //初始最大容量typedefint SElemType;typedefstruct{
SElemType *base;//栈底
SElemType *top;//栈顶}SqStack;
Status init(SqStack &s);// 初始化一个空栈
Status push(SqStack &s, SElemType e);// 元素e入栈
Status pop(SqStack &s);// 出栈
Status getTop(SqStack s, SElemType &e);// 将栈顶元素赋值给e voidclear(SqStack &s);// 清空栈 voidprintSqStack(SqStack s);//按输入的顺序打印栈中的元素 intmain(){int cmd, x;
SqStack s;init(s);while(~scanf("%d",&cmd)){switch(cmd){case1:scanf("%d",&x);if(!push(s,x))printf("full\n");break;case2:if(!pop(s))printf("empty\n");break;case3:clear(s);break;case4:if(getTop(s, x))printf("%d\n", x);elseprintf("empty\n");break;case5:printSqStack(s);break;default:printf("Unknown Command\n");break;}}}
Status init(SqStack &s){
s.base = new SElemType[MAXSIZE];if(!s.base)exit(OVERFLOW);
s.top = s.base;return OK;}
Status push(SqStack &s, SElemType e){if(s.top - s.base == MAXSIZE)return ERROR;*s.top++=e;// 元素e压入top,top+1return OK;}
Status pop(SqStack &s){if(s.top == s.base)return ERROR;int e=*--s.top;return OK;}
Status getTop(SqStack s, SElemType &e){if(s.top != s.base)
e =*(s.top-1);return OK;}voidclear(SqStack &s){
s.top = s.base;}voidprintSqStack(SqStack s){if(s.top == s.base)printf("empty");while(s.top != s.base){printf("%d ",*--s.top);}printf("\n");}
链栈:
#include<stdio.h>#include<stdlib.h>// 函数结果状态码 typedefint Status;#define OK 1#define ERROR 0#define OVERFLOW -2typedefint SElemType;// 元素数据类型 typedefstruct LNode{
SElemType data;struct LNode *next;}StackNode,*LinkStack;voidinit(LinkStack &s);// 初始化一个空栈
Status push(LinkStack &s, SElemType e);// 元素e入栈
Status pop(LinkStack &s);// 出栈
Status getTop(LinkStack s, SElemType &e);// 将栈顶元素赋值给e voidclear(LinkStack &s);// 清空栈 voidprintLinkStack(LinkStack s);//按输入的顺序打印栈中的元素 intmain(){int cmd, x;
LinkStack s;init(s);while(~scanf("%d",&cmd)){switch(cmd){case1:scanf("%d",&x);if(!push(s,x))printf("full\n");break;case2:if(!pop(s))printf("empty\n");break;case3:clear(s);break;case4:if(getTop(s, x))printf("%d\n", x);elseprintf("empty\n");break;case5:printLinkStack(s);break;default:printf("Unknown Command\n");break;}}}voidinit(LinkStack &s){
s =NULL;}
Status push(LinkStack &s, SElemType e){
StackNode *p = new StackNode;
p->data = e;
p->next = s;
s = p;return OK;}
Status pop(LinkStack &s){if(s ==NULL)return ERROR;
StackNode *p = s;
s = s->next;
delete p;return OK;}
Status getTop(LinkStack s, SElemType &e){if(s !=NULL)
e = s->data;return OK;}voidclear(LinkStack &s){while(s !=NULL)pop(s);}voidprintLinkStack(LinkStack s){if(s ==NULL)printf("empty\n");else{
StackNode *p = s;while(p){printf("%d ",p->data);
p = p->next;}printf("\n");}}
循环队列:
#include<stdio.h>#include<stdlib.h>// 函数结果状态码 typedefint Status;#define OK 1#define ERROR 0#define OVERFLOW -2#define MAXSIZE 10 typedefint QElemType;typedefstruct{
QElemType *base;//存储空间的基地址 int front;// 队头int rear;// 队尾 }SqQueue;
Status init(SqQueue &q);// 初始化一个空队列
Status enqueue(SqQueue &q, QElemType e);// 元素e入队
Status dequeue(SqQueue &q);// 出队
Status getFront(SqQueue q, QElemType &e);// 将队头元素赋值给e voidclear(SqQueue &q);// 清空队列 voidprintSqQueue(SqQueue q);//按输入的顺序打印队列中的元素 intmain(){int cmd, x;
SqQueue q;init(q);while(~scanf("%d",&cmd)){switch(cmd){case1:scanf("%d",&x);if(!enqueue(q,x))printf("full\n");break;case2:if(!dequeue(q))printf("empty\n");break;case3:clear(q);break;case4:if(getFront(q, x))printf("%d\n", x);elseprintf("empty\n");break;case5:printSqQueue(q);break;default:printf("Unknown Command\n");break;}}}
Status init(SqQueue &q){
q.base = new QElemType[MAXSIZE];if(!q.base)exit(OVERFLOW);
q.front = q.rear =0;return OK;}
Status enqueue(SqQueue &q, QElemType e){if((q.rear +1)% MAXSIZE == q.front)return ERROR;
q.base[q.rear]= e;
q.rear =(q.rear +1)% MAXSIZE;return OK;}
Status dequeue(SqQueue &q){if(q.front == q.rear)return ERROR;
q.front =(q.front +1)% MAXSIZE;return OK;}
Status getFront(SqQueue q, QElemType &e){if(q.front != q.rear){
e = q.base[q.front];return OK;}elsereturn ERROR;}voidclear(SqQueue &q){
q.front = q.rear =0;}voidprintSqQueue(SqQueue q){int x;int cnt =0;int nums[100];if(q.front == q.rear){printf("empty\n");return;}else{while(q.front != q.rear){getFront(q,x);dequeue(q);
nums[cnt++]= x;}for(int i =0; i < cnt; i++)printf("%d ",nums[i]);printf("\n");}}