#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");}}