基於C++的順序表的使用
阿新 • • 發佈:2020-11-24
標頭檔案的程式碼展示:
#ifndef header_h #define header_h #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; #define ok 1 #define error 0 #define overflow -2 #define list_init_size 100 #define listincrement 10 typedef int status; //將status定義為int型的型別,用來表示函式的返回值型別 typedef int elemtype; //將elemtype定義為int型的型別,用來表示順序表的指標型別 typedef struct { //結構體 elemtype* elem; //指標,用來存放順序表 int length; //整型變數,用來表示順序表的長度 int listsize; //整型變數,用來表示順序表的容量 }sqlist; status initlist_sq(sqlist& l);//建立順序連結串列 status listinsert_sq(sqlist& l, int i, elemtype e);//順序表的插入 status listdelete_sq(sqlist& l, int i, elemtype& e);//刪除第i個位置的資料 void print(sqlist l);//輸出順序表 status destorylist(sqlist& l);//刪除順序表 status clearlist(sqlist& l);//清空順序表中的元素 status listempty(sqlist l);//判斷順序表是否為空 status listlength(sqlist l);//返回順序表的長度 status getelem(sqlist l, int i, elemtype& e); //獲得第i個位置的元素 status loateelem(sqlist l, elemtype e);//查詢與e元素的位置 void zhuye();//選擇頁面的輸出 #endif
主函式的程式碼展示:
#include "header.h" int main() { int i, j, n, m; sqlist la; int f; initlist_sq(la); while (1) { cout << "請選擇你要需要的功能!" << endl; zhuye(); cin >> f; system("cls"); switch (f) { case 1: printf("請輸入la順序表的長度:"); cin >> m; printf("輸入la順序表資料:"); for (i = 1; i <= m; i++) { cin >> j; listinsert_sq(la, i, j); } cout << "順序表la:"; print(la); break; case 2: print(la); break; case 3: cout << "輸入要插入的元素值:"; cin >> i; cout << "輸入要插入的位置:"; cin >> j; listinsert_sq(la, j, i); cout << "輸出插入元素後的順序表la:"; print(la); break; case 4: cout << "輸入刪除元素的位置:"; cin >> i; listdelete_sq(la, i, j); cout << "刪除元素的值為" << j; cout << "\n刪除元素後的la:"; print(la); break; case 5: cout << "順序表的長度:" << listlength(la) << endl; break; case 6: cout << "\n輸入查詢的元素:"; cin >> i; if (!loateelem(la, i)) cout << "\n順序表la中沒有查詢元素" << i << endl; else cout << "\n元素" << i << "在順序表la中的位置為" << loateelem(la, i) << endl; break; case 7: cout << "\n輸入要獲取的元素的位置:"; cin >> i; if (!getelem(la, i, n)) cout << "\n輸入位置不合法" << endl; else cout << "\n要獲取的第" << i << "個元素" << "為" << n << endl; break; case 8: if (clearlist(la)) cout << "\n順序表la已經清空"; cout << "\n順序表la的長度為" << listlength(la) << endl;; if (destorylist(la)) cout << "\n順序表la被銷燬" << endl; return 0; break; } system("pause"); system("cls"); } return 0; }
函式功能的程式碼分析:
#include "header.h" status initlist_sq(sqlist& l) //建立順序連結串列 { /*********begin1**********/ l.elem = new elemtype[list_init_size];//建立順序連結串列 if (!l.elem) exit(overflow); //判斷順序表是否建立成功 l.length = 0; //初始化順序表長度 l.listsize = list_init_size; //初始化順序表容量 return ok; /********end1************/ } status listinsert_sq(sqlist& l, int i, elemtype e)//順序表的插入 { /*********begin2**********/ elemtype* q, * p, * s; //定義一個整型指標,用來存放順序表 if (i<1 || i>l.length + 1) return 0; //判斷插入的位置是否超出了順序表的有效資料長度 if (l.length >= list_init_size) { //如果容量已滿,則執行以下括號內的步驟 s = (elemtype*)realloc(l.elem, (l.listsize + 10) * sizeof(elemtype)); //建立一個新的順序表(容量比原來多10),並將原來的資料複製給新的順序表 if (!s) exit(-2); //判斷是否建立成功 l.elem = s; //將原來的順序表替換為新的順序表 l.listsize += 10; //將順序表的容量在原來的基礎上加10 } q = &(l.elem[i - 1]); //將順序表中第i個位置(即順序表中的下標為i-1)的地址賦給q for (p = &(l.elem[l.length - 1]); p >= q; --p) *(p + 1) = *p; //將第i個之後的位置後移 *q = e; //將q中的資料替換成e ++l.length; //將長度加一 return 1; /********end2************/ } status listdelete_sq(sqlist& l, int i, elemtype& e)//刪除第i個位置的資料 { /*********begin3**********/ if (i<1 || i>l.length) return 0;//判斷插入的位置是否超出了順序表的有效資料長度 elemtype* q, * p; //定義一個整型指標 q = &(l.elem[i - 1]); //將順序表中第i個位置(即順序表中的下標為i-1)的地址賦給q e = *q; //將第i個位置的值給e p = l.elem + l.length - 1; //將p指標指到順序表的尾部 for (++q; p >= q; ++q) *(q - 1) = *q; //將第i個之後的資料前移 --l.length; //長度減一 return 1; /********end3************/ } void print(sqlist l) { //輸出順序表 int i; //定義一個變數,用來表示順序表的下標 for (i = 0; i < l.length - 1; i++) //從下標為0開始,一直到下標為長度減一 cout << l.elem[i] << ' '; //輸出資料,並帶上空格 cout << l.elem[i]<<endl; //最後一個不輸出空格 } status destorylist(sqlist& l)//刪除順序表 { free(l.elem); //刪除l.elem指標 return ok; } status clearlist(sqlist& l)//清空順序表中的元素 { l.length = 0; //直接賦值為0即可 return ok; } status listempty(sqlist l)//判斷順序表是否為空 { if (l.length == 0) return 1; else return 0; //如果為空,則返回1,否則返回0 } status listlength(sqlist l) //返回順序表的長度 { return l.length; } status getelem(sqlist l, int i, elemtype& e) //獲得第i個位置的元素 { /*********begin4**********/ if (i<1 || i>l.length) return 0;//判斷插入的位置是否超出了順序表的有效資料長度 e = l.elem[i - 1]; //將順序表中第i個位置(即順序表中的下標為i-1)的元素賦給e return 1; /********end4************/ } status loateelem(sqlist l, elemtype e) //查詢與e元素的位置 { /*********begin5**********/ for (int i = 0; i < l.length; i++) if (l.elem[i] == e) return i + 1; return 0; /********end5************/ } void zhuye()//選擇頁面的輸出 { cout << "輸入1:在順序表中新增資料" << endl; cout << "輸入2:檢視順序表的所有元素" << endl; cout << "輸入3:在順序表中插入資料" << endl; cout << "輸入4:在順序表中刪除資料" << endl; cout << "輸入5:檢視順序表的長度" << endl; cout << "輸入6:通過元素查詢順序表中的資料" << endl; cout << "輸入7:通過位置檢視順序表中的資料" << endl; cout << "輸入8:推出" << endl; cout << "請輸入:"; }