顺序表—线性表的顺序结构实现(代码)
顺序表—线性表的顺序结构实现
1 #include<stdio.h> 2 #include<stdlib.h> 3 //顺序表的静态实现 4 #define MaxSize 10 //定义顺序表最大长度 5 typedef int ElemType; //定义一个类型,便于以后修改 6 typedef struct { //定义顺序表结构体 7 ElemType data[MaxSize]; //静态数组实现 8 int length; //当前表长度 9 }SqList; 10 //初始化顺序表 11 void InitList(SqList& L) 12 { 13 for (int i = 0; i < MaxSize; i++) //初始化顺序表,将表中元素以及表长设置为0,防止脏数据的影响 14 L.data[i] = 0; 15 L.length = 0; 16 } 17 //判空操作 18 bool EmptyList(SqList L) 19 { 20 if (L.length == 0) //判断顺序表是否为空 21 return true; 22 return false; 23 } 24 //插入元素 时间复杂度O(n) 25 bool ListInsert(SqList& L, int i, ElemType e) 26 { 27 if (i<1 || i>L.length + 1) //判断i的范围是否有效 28 return false; 29 if (L.length >= MaxSize) //当前数组已满,不允许插入 30 return false; 31 for (int j = L.length; j >= i; j--) //插入位置之后的所有元素向后移一位 32 L.data[j] = L.data[j-1]; 33 L.data[i - 1] = e; //将元素插入到对应位置 34 L.length++; //顺序表长度加一 35 return true; //一定要记住,插入或删除元素后,需要将修改顺序表的长度 36 } 37 //删除元素 时间复杂度O(n) 38 bool ListDelete(SqList& L, int i, ElemType& e) 39 { 40 if (i<1 || i>L.length) //判断i的范围是否合法,另删除元素不需要判断表是否已满 41 return false; 42 e = L.data[i - 1]; //取出被删除的元素赋给e, 43 for (int j = i; j < L.length; j++) 44 L.data[j - 1] = L.data[j]; //将被删除位置之后的元素向前移动一位 45 L.length--; //将顺序表的长度减1 46 return true; 47 } 48 //按位查找 时间复杂度O(1) 49 int GetElem(SqList L, int i) 50 { 51 return L.data[i - 1]; //返回第i个位置的元素 52 } 53 //按值查找 时间复杂度O(n) 54 int LocateElem(SqList L, ElemType e) 55 { 56 for (int i = 0; i < L.length; i++) 57 if (e == L.data[i]) //依序查找表中元素是否与所要找的元素相等 58 return i + 1; 59 return 0; 60 } 61 //打印顺序表 62 void PrintList(SqList L) 63 { 64 int i; 65 for (i = 0; i < L.length; i++) //逐一遍历打印顺序表中的元素 66 printf("%3d", L.data[i]); //元素之间以空格隔开 67 printf("\n"); 68 } 69 //主函数 70 int main() 71 { 72 SqList L; //在主函数中定义一个线性表 73 bool ret; //定义一个布尔类型的变量,用于后续操作 74 int is_deleted; //定义一个变量,用于存放被删除的元素 75 int get_element; //定义一个变量,用于存放按位查找到的元素 76 int locate_element; //定义一个变量,用于存放按值查找到的元素的位序 77 InitList(L); //初始化 78 ret= EmptyList(L); //判空 79 if (ret) 80 printf("顺序表是空的\n"); 81 else 82 printf("顺序表不为空\n"); 83 printf("\n"); 84 L.data[0] = 12; //向顺序表中插入一些元素 85 L.data[1] = 23; 86 L.data[2] = 34; 87 L.data[3] = 45; 88 L.data[4] = 56; 89 L.length = 5; //设置表长 90 91 ret = ListInsert(L, 6, 99); //在第6个位置(表尾)插入99 92 if (ret) 93 printf("插入成功\n"); 94 else 95 printf("插入失败\n"); 96 PrintList(L); //打印插入元素之后的顺序表 97 ret = ListInsert(L, 1, 108); //在第1个位置(表头)插入108 98 if (ret) 99 printf("插入成功\n"); 100 else 101 printf("插入失败\n"); 102 PrintList(L); //再次打印插入元素之后的顺序表 103 printf("\n"); 104 105 ret=ListDelete(L, 2, is_deleted);//删除元素 106 if (ret) 107 printf("被删除的元素是%d\n", is_deleted); //打印被删除的元素 108 else 109 printf("删除失败\n"); 110 PrintList(L); //打印删除元素之后的顺序表 111 printf("\n"); 112 113 get_element = GetElem(L, 2); //按位查找第2个元素 114 printf("第2个元素是%d\n", get_element); 115 printf("\n"); 116 117 locate_element = LocateElem(L, 34);//按值查找元素34的位序 118 printf("34是第%d个元素\n", locate_element); 119 120 return 0; 121 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)