头文件的代码展示:
#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; typedef int elemtype; 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 << "请输入:"; }
原文:https://www.cnblogs.com/cheng111/p/14029735.html