线性表的C/C++实现(数据结构 严蔚敏版)
生活随笔
收集整理的這篇文章主要介紹了
线性表的C/C++实现(数据结构 严蔚敏版)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
下面的代碼是項(xiàng)目文件:一個(gè)頭文件、一個(gè)源文件、一個(gè)測(cè)試文件
1、頭文件List.h:
#include<iostream> using namespace std; #include<malloc.h>/*定義數(shù)據(jù)的類(lèi)型,可以通過(guò)修改這里的數(shù)據(jù)類(lèi)型,來(lái)實(shí)現(xiàn)不同類(lèi)型的線(xiàn)性表 下面的數(shù)據(jù)類(lèi)型可以更改,const引用是限制被調(diào)用的函數(shù),不能修改主程序的數(shù)據(jù),但可以查看,達(dá)到保護(hù)主程序數(shù)據(jù)安全。 不需要執(zhí)行修改操作,而只要查看數(shù)據(jù)的線(xiàn)性表就用const限制 引用 */ typedef int Status; typedef int ElemType;#define LIST_INIT_SIZE 10 //初始化的空間分配容量 #define LIST_ADD 10 //每次增加的分配空間增量 #define ok 1 #define error 0 #define flow 0//定義一個(gè)線(xiàn)性表結(jié)構(gòu),結(jié)構(gòu)內(nèi)有分配空間的基地址,分配空間的總長(zhǎng)度,當(dāng)前使用空間的大小。 typedef struct{ElemType* elem; //空間基地址 int length; //當(dāng)前已經(jīng)使用的空間的長(zhǎng)度 int listsize; //當(dāng)前分配的空間長(zhǎng)度 }SqList;//初始化線(xiàn)性表 Status InitList(SqList& L); //打印線(xiàn)性表 Status Print(SqList L);//銷(xiāo)毀線(xiàn)性表 Status DestroyList(SqList& L);//將線(xiàn)性表清空 Status ClearList(SqList& L);//判斷線(xiàn)性表是否為空 Status ListEmpty(const SqList& L);//返回線(xiàn)性表中元素的個(gè)數(shù) Status ListLength(const SqList& L);//獲取線(xiàn)性表中的第i個(gè)元素的值 Status Get(const SqList& L, int i, ElemType& e); //如果當(dāng)前元素cur_e不是第一個(gè)數(shù)據(jù),就pre_e返回它的前一個(gè)數(shù)據(jù)的值,否則返回error Status PriorElem(const SqList& L, ElemType cur_e, ElemType& pre_e);//如果當(dāng)前元素不會(huì)最后一個(gè),就用next_e返回它的后一個(gè)數(shù)值,否則返回error Status NextElem(const SqList& L, ElemType cur_e, ElemType& next_e);//在第i個(gè)位置前插入數(shù)據(jù)e, 數(shù)據(jù)長(zhǎng)度加一 Status ListInsert(SqList& L, int i, ElemType e);// 刪除i個(gè)位置的數(shù)據(jù),數(shù)據(jù)長(zhǎng)度減一,并返回?cái)?shù)據(jù) Status ListDelete(SqList& L, int i, ElemType& e);//合并線(xiàn)性表LA和LB,將結(jié)果放入LA中 Status Union(SqList& LA, const SqList& B); //合并線(xiàn)性表 Status MergeList(const SqList& LA, const SqList& LB, SqList& LC); //查詢(xún)數(shù)據(jù)的位置 int LocateElem(const SqList& L, ElemType e);//插入n個(gè)數(shù)據(jù) Status Insert(SqList& L, int n);2、源文件List.cpp:
#include "List.h" //這是功能實(shí)現(xiàn)源文件,其他程序可以通過(guò)頭文件包含,使用這里的功能 //初始化線(xiàn)性表 Status InitList(SqList& L){L.elem = (ElemType* )(malloc( LIST_INIT_SIZE * sizeof(ElemType)));//如果地址分配錯(cuò)誤,就返回0 if(!L.elem) exit(error);//將當(dāng)前長(zhǎng)度設(shè)置為0,分配長(zhǎng)度設(shè)置為初始長(zhǎng)度 L.length = 0;L.listsize = LIST_INIT_SIZE;return ok;}//銷(xiāo)毀線(xiàn)性表 Status DestroyList(SqList& L){//如果地 if(!L.elem){cout<<"線(xiàn)性表不存在"<<endl;}else{free(L.elem);L.elem = NULL;}return ok; } //打印線(xiàn)性表 Status Print(SqList L){cout<<"線(xiàn)性表的數(shù)據(jù)如下:"<<endl;if(L.length == 0){cout<<"線(xiàn)性表為空表, 請(qǐng)插入數(shù)據(jù)后再來(lái)打印數(shù)據(jù)\n\n"<<endl;}for(int i=0; i<L.length; i++){cout<<L.elem[i]<<" ";}cout<<endl; } //將線(xiàn)性表清空 Status ClearList(SqList& L){//如果線(xiàn)性表的當(dāng)前長(zhǎng)度不為0,就將數(shù)據(jù)全部清空,當(dāng)前長(zhǎng)度設(shè)置為0 if(L.length != 0){for(int i=0; i<L.length; i++){L.elem[i] = 0;}L.length = 0;}return ok; }//判斷線(xiàn)性表是否為空 Status ListEmpty(const SqList& L){if(L.length != 0){//不為空表 return ok;}else{//為空表 return error;} }//返回線(xiàn)性表中元素的個(gè)數(shù) Status ListLength(const SqList& L){return L.length; } //獲取線(xiàn)性表中的第i個(gè)元素的值 Status Get(const SqList& L, int i, ElemType& e){if(i > L.length || i < 0){cout<<"輸入有誤,退出"<<endl;return error;}else{e = L.elem[i-1];return ok;} }//如果當(dāng)前元素cur_e不是第一個(gè)數(shù)據(jù),就pre_e返回它的前一個(gè)數(shù)據(jù)的值,否則返回error Status PriorElem(const SqList& L, ElemType cur_e, ElemType& pre_e){int flag = LocateElem(L, cur_e);if(flag == -1){cout<<"找不到數(shù)據(jù)"<<endl; return error;}if(flag == 0){cout<<"數(shù)據(jù)不存在直接前驅(qū)"<<endl; }else{pre_e = L.elem[flag-1];}} //如果 當(dāng)前元素不會(huì)最后一個(gè),就用next_e返回它的后一個(gè)數(shù)值,否則返回error Status NextElem(const SqList& L, ElemType cur_e, ElemType& next_e){int flag = LocateElem(L, cur_e);if(flag = -1){cout<<"數(shù)據(jù)不存在"<<endl; }else if(flag == L.length){cout<<"該數(shù)據(jù)不存在直接后繼"<<endl;}else{next_e = L.elem[flag+1];} } //在第i個(gè)位置前插入數(shù)據(jù)e, 數(shù)據(jù)長(zhǎng)度加一 Status ListInsert(SqList& L, int i, ElemType e){if(i<1 || i > L.length+1) {cout<<"輸入的位置有問(wèn)題"<<endl; return error;}if(L.length == L.listsize){//增加LIST_ADD長(zhǎng)度的地址空間 L.elem = (ElemType*)(realloc(L.elem, (LIST_ADD) * sizeof(ElemType)));if(!L.elem) exit(flow); //更新分配的長(zhǎng)度 L.listsize = L.listsize + LIST_ADD;//取要插入位置的地址 ElemType* q = &(L.elem[i-1]);//如果地址p比插入的地址q大或則等于,就將數(shù)據(jù)復(fù)制到后面一位空間里面,空出地址q的存儲(chǔ)空間 for(ElemType* p = &(L.elem[L.length-1]); p>= q; p--){*(p+1) = *p;} //給地址空間q賦值 *q = e;//當(dāng)前長(zhǎng)度+1 L.length++;}else{//如果分配空間沒(méi)有使用完,執(zhí)行下面操作//取要插入位置的地址 ElemType* q = &(L.elem[i-1]);//如果地址p比插入的地址q大或則等于,就將數(shù)據(jù)復(fù)制到后面一位空間里面,空出地址q的存儲(chǔ)空間 for(ElemType* p = &(L.elem[L.length-1]); p>= q; p--){*(p+1) = *p;} //給地址空間q復(fù)制 *q = e;//當(dāng)前長(zhǎng)度+1 L.length++;}return ok;} // 刪除i個(gè)位置的數(shù)據(jù),數(shù)據(jù)長(zhǎng)度減一,并返回?cái)?shù)據(jù) Status ListDelete(SqList& L, int i, ElemType& e){if(i > L.length || i<0){cout<<"你刪除的數(shù)據(jù)不存在\n\n"<<endl;return error; }else{ElemType* q = &L.elem[i-1];e = *q;q = &L.elem[L.length-1];for(ElemType* p = &L.elem[i-1]; p<= q; p++){*p = *(p+1);}L.length--;cout<<"刪除成功\n\n"<<endl;return ok;} } //合并線(xiàn)性表,將LA和LB合并后的結(jié)果替換為L(zhǎng)A Status Union(SqList& LA, const SqList& LB){int LA_length = LA.length;int LB_length = LB.length;ElemType e;for(int i=0; i<= LB_length; i++){//獲取LB的第i個(gè)位置的數(shù)據(jù) Get(LB, i, e);for(int i=0; i<LB_length; i++){//在LA中查詢(xún)數(shù)據(jù)e是否存在,不存在就返回i,存在就返回-1 int index = LocateElem(LA, e);//不為-1就在LA中插入數(shù)據(jù) e if(index != -1){ListInsert(LA, ++LA.length, e); }} } cout<<"線(xiàn)性表合并完成, 查看第一個(gè)線(xiàn)性表可以查看合并后的數(shù)據(jù)"<<endl;return ok; } //合并有序線(xiàn)性表,并排序,將結(jié)果放有序入LC中 Status MergeList(const SqList& LA, const SqList& LB, SqList& LC){InitList(LC);int i, j, k;i = j = 1;k = 0;ElemType a, b;int la_length = LA.length; int lb_length = LB.length;while((i <= la_length) && (j <= lb_length)){Get(LA, i, a); Get(LB, j, b);if(a <= b){{ListInsert(LC, ++k, a);i++;}}else{ListInsert(LC, ++k, b);j++;}}while(i <= la_length){Get(LA, i++, a);ListInsert(LC, ++k, a);}while(j <= lb_length){Get(LB, j++, b);ListInsert(LC, ++k, b);}} //查詢(xún)某個(gè)數(shù)據(jù)e的位置 int LocateElem(const SqList& L, ElemType e){if(L.length == 0){return -1;}for(int i=0; i<L.length; i++){if(L.elem[i] == e){return i+1;}else{return -1;}}} //插入n個(gè)數(shù)據(jù)Status Insert(SqList& L, int n){ElemType e;if(n + L.length > L.listsize){L.elem = (ElemType*)(realloc(L.elem, (LIST_ADD) * sizeof(ElemType)));//如果地址分配失敗,就返回錯(cuò)誤 if(!L.elem) return error;L.listsize = L.listsize + LIST_ADD;}cout<<"請(qǐng)輸入你要插入的"<<n<<"數(shù)據(jù)"<<endl;for(int i=L.length; i<n; i++){cin>> L.elem[i];}cout<<"數(shù)據(jù)插入完成\n\n"<<endl; L.length = L.length + n;return ok;}3、測(cè)試文件test.cpp:
#include <iostream> #include "List.h"/* run this program using the console pauser or add your own getch, system("pause") or input loop *///測(cè)試一個(gè)線(xiàn)性表功能 int main(int argc, char** argv) {SqList L;cout<<"請(qǐng)輸入你的操作"<<endl;cout<<" 0-----退出\n"<<endl;cout<<" 1-----初始化線(xiàn)性表\n"<<endl;int n;int i;ElemType e;//初始化線(xiàn)性表 InitList(L);while(1){cout<<"請(qǐng)輸入你的操作"<<endl;cin>>n;if(n>1 || n < 0){cout<<"你輸入的有問(wèn)題,請(qǐng)重新輸入"<<endl;}else{break;}} if(n == 0){cout<<"你已退出"<<endl;exit(flow);}//進(jìn)入操縱while(1){switch(n){case 0: //銷(xiāo)毀之后重新進(jìn)行初始化,并退出 DestroyList(L);cout<<"線(xiàn)性表銷(xiāo)毀成功\n\n"<<endl;cout<<"你已退出"<<endl;exit(flow); case 1://重新初始化線(xiàn)性表 if(L.elem){free(L.elem);cout<<"重新初始化成功,原來(lái)數(shù)據(jù)被清空\(chéng)n\n"<<endl;}InitList(L); break;case 2://查看線(xiàn)性表所有數(shù)據(jù) Print(L); break;case 3://數(shù)據(jù)插入 cout<<"請(qǐng)輸入你要插入的位置和數(shù)據(jù)\n"<<endl;cin>>i;cin>>e;if(ListInsert(L, i, e)){cout<<"插入成功\n\n"<<endl;} else{cout<<"插入失敗\n\n"<<endl;}break;case 4://刪除功能 cout<<"請(qǐng)輸入你要?jiǎng)h除的位置"<<endl;cin>>i;ListDelete(L, i, e);break;case 5://查詢(xún)數(shù)據(jù) cout<<"請(qǐng)輸入你要查詢(xún)的數(shù)據(jù)"<<endl;cin>>e;i = LocateElem(L, e);if(i != -1){cout<<"你查詢(xún)的數(shù)據(jù)是第"<<i<<"個(gè)位置\n\n"<<endl;}else{cout<<"你查詢(xún)的數(shù)據(jù)不存在\n\n"<<endl; }break;case 6://判斷線(xiàn)性表是否為空 if(!ListEmpty(L)){cout<<"線(xiàn)性表為空表\n\n"<<endl;}else{cout<<"線(xiàn)性表不為空\(chéng)n\n"<<endl;}break;}cout<<" 0-----退出,并銷(xiāo)毀線(xiàn)性表\n"<<endl;cout<<" 1-----重新初始化線(xiàn)性表\n"<<endl;cout<<" 2-----打印線(xiàn)性表\n"<<endl;cout<<" 3-----插入數(shù)據(jù)\n"<<endl;cout<<" 4-----刪除某個(gè)數(shù)據(jù)\n"<<endl;cout<<" 5-----查詢(xún)數(shù)據(jù)的位置\n"<<endl;cout<<" 6-----判斷線(xiàn)性表是否為空\(chéng)n"<<endl;cout<<"請(qǐng)輸入你的操作"<<endl;//控制操作輸入 while(1){//輸入操作方式 cin>>n;cout<<endl;if(n>6 || n < 0){cout<<"你輸入的有問(wèn)題,請(qǐng)重新輸入"<<endl;}else{break;}} }return 0; }總結(jié)
以上是生活随笔為你收集整理的线性表的C/C++实现(数据结构 严蔚敏版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 交换机怎么使用vtp
- 下一篇: 单链表C/C++实现(数据结构严蔚敏)