新手出路,多多请教!!

线性表的定义:

线性表(linear list)是最基本、最简单、最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的,但这只适用大部分线性表,而不是全部。在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。

线性表的功能以下:

======1.输入数据======
======2.输出数据======
======3.插入数据======
======4.查找指定位置的元素======
======5.删除指定位置的元素======
======6.增加线性表======
======7.线性表合并=======
======8.清空线性表=======
======0.退出程序======

使用typedef struct定义一个线性表sqlist,代码如下:(详情见代码解释)

#define SIZE 100
typedef int ElemType;
typedef int status;typedef struct sqlist {ElemType* elem;//存放线性表地址string name;//给线性表一个名字,便于后续有需要输出时利用int length;    //存放线性表长度int listsize;  //存放线性表的个数
}SqList;//定义线性表

其中的SqList时为了在以下的操作中使用。

定义线性表后,我们需要对线性表初始化:

该过程中用到函数malloc,他的用法在C中C++是有差异的,使用它需要头文件的#include<malloc.h>

(详情见代码解释)

status IniList(SqList* L,string name){L->elem = (int*)malloc(SIZE*sizeof(ElemType));//为L争取动态存储空间L->length = 0;//初始化是将线性表的长度设置为0L->listsize = SIZE;//表格的最长长度为100,若要修改见顶部L->name = name;//给线性表一个名字return 1;//正常退出
}//线性表的初始化

在main()中先初始化三个线性表:IniList(&表格名,string name)

IniList(&L1,"1");
IniList(&L2,"2");
IniList(&L_Merge,"_Merge");//三个表格初始化,然后给表L1赋值

线性表的赋值:(详情见代码解释)input(SqList* L,int Num),其中的Num是输入的数的个数

void input(SqList* L,int Num){L->length = Num;//将输入的数据的个数作为线性表的长度for (int i = 0; i < L->length; i++){scanf_s("%d", &L->elem[i]);//给线性表赋值}printf("输入完毕!\n");
}//给线性表赋值

线性表的输出:(详情见代码解释)Display(SqList* L)

void Display(SqList* L){if (L->length == 0) {return;}//如果线性表为空的话,直接退出cout << "L" << L->name << ":";for (int i = 0; i < L->length; i++) {printf("%d", L->elem[i]);printf(" ");}printf("\n");
}//打印线性表

在线性表中插入值的操作:使用ListInsert(SqList*L),(详情见代码解释)

status ListInsert(SqList* L) {int pos;//定义position的缩写pos,为插入数据的位置ElemType* p, * p1, * p2,value;if (L->length == 0) {printf("\n此表为空,无法插入数据,插入数据程序已退出!!!\n");return 0;}//判断插入数据的表格是否为空,空的话退出printf("\n请输入要插入的位置:");scanf_s("%d", &pos); if (pos<1 || pos>L->length+1) {printf("插入位置信息错误!\n");return 0;}//判断插入值的位置是否合理,不合理则推出printf("请输入要插入的元素:");scanf_s("%d", &value);if (L->length >= L->listsize) {p =(int*)realloc(L->elem, sizeof(ElemType) * (L->listsize + 10));if (!p) return 0;L->elem = p;//新地址赋给LL->listsize += 10;//大小应进行相应调整改变} //空间不足时,扩充容量,这个if条件语句一般用不上,可以省略p1 = &L->elem[pos - 1];for (p2 = &L->elem[L->length - 1]; p2 >= p1; p2--) {*(p2 + 1) = *(p2);//向后移动一个单位}L->elem[pos - 1] = value;L->length++;return 1;
}//插入元素

线性表中删除指定位置的值操作:(详情见代码解释)DeleteDate(SqList* L)

status DeleteDate(SqList* L) {int pos_delete;//定义删除数据的位置while (true) {printf("请输入你要删除的数据的位置(该表的长度为:%d):", L->length);cin >> pos_delete;if (pos_delete-1<0 || pos_delete-1>=L->length) {printf("\n输入的位置有误!请重新输入!!\n");continue;}else break;}//判断删除数据的位置是否合理,合理则退出while循环结构int date_delete = L->elem[pos_delete-1];//由于角标是从0开始的,所以我们需要pos_delete-1来进行操作for (int i = pos_delete-1; i <= L->length-1; i++) {L->elem[i] = L->elem[i + 1];}//由于角标是从0开始的,所以我们需要pos_delete-1来进行操作L->length = L->length - 1;printf("已删除数据:%d\n", date_delete);return 1;
}//删除数据

在线性表中查找数据的操作如下:(详情看代码解析)SearchDate(SqList*L)

status SearchDate(SqList*L){int pos_search;//定义查找的位置while (true) {printf("请输入你要查找的位置(该表的长度为:%d):", L->length);cin >> pos_search;if (pos_search-1 < 0 || pos_search-1 >= L->length) {printf("\n输入的位置有误!请重新输入!!\n");continue;}else break;}//判断查找数据的位置是否合理,合理则退出while循环结构printf("这个值是:%d\n", L->elem[pos_search-1]);//由于角标是从0开始的,所以我们需要pos_search-1来输出return 1;
}//查找数据

线性表中的数据添加线性表的操作:(详情看代码解析) AddList(SqList *L,int Num)    其中的Num是输入的数的个数

status AddList(SqList *L,int Num) {L->length = Num;//增加线性表,该线性表的长度=输入值的个数for (int i = 0; i < L->length; i++){scanf_s("%d", &L->elem[i]);}printf("输入完毕!\n");return 1;
}//增加数据

线性表的合并:ListMerge(SqList*表1, SqList* 表2, SqList* 合并表名)(详情看代码)

status ListMerge(SqList* L1, SqList* L2, SqList* L_Merge) {L_Merge->length = L1->length + L2->length;//将要合并的线性表的长度相加,然后赋值给合并表格的长度int pos1 = L1->length, pos2 = L2->length;//定义pos1和pos2是为了一下便于赋值给合并表for (int i = 0; i < L1->length; i++) {L_Merge->elem[i] = L1->elem[i];}for (int i = L1->length, k = 0; k < L2->length; k++, i++) {L_Merge->elem[i] = L2->elem[k];}/*此for循环的条件体比较关键,int i = L1->length这条语句是使用了表L1的长度由于角标是从0开始的,所以这里直接利用L1的长度作为角标来开始取值*/IniList(L1,"1");IniList(L2,"2");//合并表格以后,将两表初始化(相当于销毁线性表)printf("合并完毕!\n");return 1;
}//线性表合并

销毁线性表的方法:DeleteList(SqList*表1, SqList* 表2, SqList* 表3)

status DeleteList(SqList* L1, SqList* L2, SqList* L_Merge) {IniList(L1,"1");IniList(L2,"2");IniList(L_Merge,"_Merge");printf("销毁线性表完毕!\n");return 1;
}//销毁线性表,其本质是将线性表重新初始化,此时每个表格的长度皆为0,故已销毁

main()函数主体代码:

int main(){SqList L1, L2, L_Merge;//定义三个表格string answer;int i=1;while (true) {start:printf("===================================\n");printf("======1.输入数据======\n");//inputprintf("======2.输出数据======\n");//Displayprintf("======3.插入数据======\n");//ListInsertprintf("======4.查找指定位置的元素======\n");//SearchDateprintf("======5.删除指定位置的元素======\n");//DeleteDateprintf("======6.增加线性表======\n");//AddListprintf("======7.线性表合并=======\n");//Unionprintf("======8.清空线性表=======\n");//IniListprintf("======0.退出程序======\n");printf("===================================\n");printf("\n请输入相应数字进行此程序:");scanf_s("%d", &i);switch (i) {case 1://给线性表赋值IniList(&L1,"1");IniList(&L2,"2");IniList(&L_Merge,"_Merge");//三个表格初始化,然后给表L1赋值printf("请输入数的个数:");scanf_s("%d", &L1.length);input(&L1, L1.length); system("pause");system("cls");goto start;case 2://查看表Display(&L1);if (&L2.length != 0) {printf("\n");Display(&L2);}if (&L_Merge.length != 0) {printf("\n");Display(&L_Merge);}system("pause");system("cls");goto start;case 3://插入元素printf("请输入你要插入数据的表格名称(L1,L2,L_Merge):");cin >> answer;if(answer=="L1")ListInsert(&L1);if (answer == "L2")ListInsert(&L2);if (answer == "L_Merge")ListInsert(&L_Merge);system("pause");system("cls");goto start;case 4:printf("请输入查找哪个表格的数据(L1,L2,L_Merge;注意区分大小写):");cin >> answer;if (answer == "L1")SearchDate(&L1);if (answer == "L2")SearchDate(&L2);if (answer == "L_Merge")SearchDate(&L_Merge);system("pause");system("cls");goto start;case 5:printf("请输入你要删除哪个表格中的数据(L1,L2,L_Merge;注意区分大小写):");cin >> answer;if (answer == "L1")DeleteDate(&L1);if (answer == "L2")DeleteDate(&L2);if (answer == "L_Merge")DeleteDate(&L_Merge);system("pause");system("cls");goto start;case 6://增加线性表printf("请输入数的个数:");scanf_s("%d", &L2.length);AddList(&L2, L2.length);system("pause");system("cls");goto start;case 7:ListMerge(&L1, &L2, &L_Merge);system("pause");system("cls");goto start;case 8:IniList(&L1, "1");IniList(&L2, "2");IniList(&L_Merge, "_Merge");system("pause");system("cls");goto start;case 0:printf("确定退出程序吗?(yes or no):");cin >> answer;if (answer == "yes"||answer=="YES")exit(0);if (answer == "no" || answer == "NO") {system("pause");system("cls");goto start;}}}return 0;
}

完整代码:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<malloc.h>
using namespace std;#define SIZE 100
typedef int ElemType;
typedef int status;typedef struct sqlist {ElemType* elem;//存放线性表地址string name;//给线性表一个名字,便于后续有需要输出时利用int length;    //存放线性表长度int listsize;  //存放线性表的个数
}SqList;//定义线性表
status IniList(SqList* L,string name){L->elem = (int*)malloc(SIZE*sizeof(ElemType));//为L争取动态存储空间L->length = 0;//初始化是将线性表的长度设置为0L->listsize = SIZE;//表格的最长长度为100,若要修改见顶部L->name = name;//给线性表一个名字return 1;//正常退出
}//线性表的初始化
void input(SqList* L,int Num){L->length = Num;//将输入的数据的个数作为线性表的长度for (int i = 0; i < L->length; i++){scanf_s("%d", &L->elem[i]);//给线性表赋值}printf("输入完毕!\n");
}//给线性表赋值
void Display(SqList* L){if (L->length == 0) {return;}//如果线性表为空的话,直接退出cout << "L" << L->name << ":";for (int i = 0; i < L->length; i++) {printf("%d", L->elem[i]);printf(" ");}printf("\n");
}//打印线性表
status ListInsert(SqList* L) {int pos;//定义position的缩写pos,为插入数据的位置ElemType* p, * p1, * p2,value;if (L->length == 0) {printf("\n此表为空,无法插入数据,插入数据程序已退出!!!\n");return 0;}//判断插入数据的表格是否为空,空的话退出printf("\n请输入要插入的位置:");scanf_s("%d", &pos); if (pos<1 || pos>L->length+1) {printf("插入位置信息错误!\n");return 0;}//判断插入值的位置是否合理,不合理则推出printf("请输入要插入的元素:");scanf_s("%d", &value);if (L->length >= L->listsize) {p =(int*)realloc(L->elem, sizeof(ElemType) * (L->listsize + 10));if (!p) return 0;L->elem = p;//新地址赋给LL->listsize += 10;//大小应进行相应调整改变} //空间不足时,扩充容量,这个if条件语句一般用不上,可以省略p1 = &L->elem[pos - 1];for (p2 = &L->elem[L->length - 1]; p2 >= p1; p2--) {*(p2 + 1) = *(p2);//向后移动一个单位}L->elem[pos - 1] = value;L->length++;return 1;
}//插入元素
status AddList(SqList *L,int Num) {L->length = Num;//增加线性表,该线性表的长度=输入值的个数for (int i = 0; i < L->length; i++){scanf_s("%d", &L->elem[i]);}printf("输入完毕!\n");return 1;
}//增加数据
status SearchDate(SqList*L){int pos_search;//定义查找的位置while (true) {printf("请输入你要查找的位置(该表的长度为:%d):", L->length);cin >> pos_search;if (pos_search-1 < 0 || pos_search-1 >= L->length) {printf("\n输入的位置有误!请重新输入!!\n");continue;}else break;}//判断查找数据的位置是否合理,合理则退出while循环结构printf("这个值是:%d\n", L->elem[pos_search-1]);//由于角标是从0开始的,所以我们需要pos_search-1来输出return 1;
}//查找数据
status DeleteDate(SqList* L) {int pos_delete;//定义删除数据的位置while (true) {printf("请输入你要删除的数据的位置(该表的长度为:%d):", L->length);cin >> pos_delete;if (pos_delete-1<0 || pos_delete-1>=L->length) {printf("\n输入的位置有误!请重新输入!!\n");continue;}else break;}//判断删除数据的位置是否合理,合理则退出while循环结构int date_delete = L->elem[pos_delete-1];//由于角标是从0开始的,所以我们需要pos_delete-1来进行操作for (int i = pos_delete-1; i <= L->length-1; i++) {L->elem[i] = L->elem[i + 1];}//由于角标是从0开始的,所以我们需要pos_delete-1来进行操作L->length = L->length - 1;printf("已删除数据:%d\n", date_delete);return 1;
}//删除数据
status ListMerge(SqList* L1, SqList* L2, SqList* L_Merge) {L_Merge->length = L1->length + L2->length;//将要合并的线性表的长度相加,然后赋值给合并表格的长度int pos1 = L1->length, pos2 = L2->length;//定义pos1和pos2是为了一下便于赋值给合并表for (int i = 0; i < L1->length; i++) {L_Merge->elem[i] = L1->elem[i];}for (int i = L1->length, k = 0; k < L2->length; k++, i++) {L_Merge->elem[i] = L2->elem[k];}/*此for循环的条件体比较关键,int i = L1->length这条语句是使用了表L1的长度由于角标是从0开始的,所以这里直接利用L1的长度作为角标来开始取值*/IniList(L1,"1");IniList(L2,"2");//合并表格以后,将两表初始化(相当于销毁线性表)printf("合并完毕!\n");return 1;
}//线性表合并
status DeleteList(SqList* L1, SqList* L2, SqList* L_Merge) {IniList(L1,"1");IniList(L2,"2");IniList(L_Merge,"_Merge");printf("销毁线性表完毕!\n");return 1;
}//销毁线性表,其本质是将线性表重新初始化,此时每个表格的长度皆为0,故已销毁
int main(){SqList L1, L2, L_Merge;//定义三个表格string answer;int i=1;while (true) {start:printf("===================================\n");printf("======1.输入数据======\n");//inputprintf("======2.输出数据======\n");//Displayprintf("======3.插入数据======\n");//ListInsertprintf("======4.查找指定位置的元素======\n");//SearchDateprintf("======5.删除指定位置的元素======\n");//DeleteDateprintf("======6.增加线性表======\n");//AddListprintf("======7.线性表合并=======\n");//Unionprintf("======8.清空线性表=======\n");//IniListprintf("======0.退出程序======\n");printf("===================================\n");printf("\n请输入相应数字进行此程序:");scanf_s("%d", &i);switch (i) {case 1://给线性表赋值IniList(&L1,"1");IniList(&L2,"2");IniList(&L_Merge,"_Merge");//三个表格初始化,然后给表L1赋值printf("请输入数的个数:");scanf_s("%d", &L1.length);input(&L1, L1.length); system("pause");system("cls");goto start;case 2://查看表Display(&L1);if (&L2.length != 0) {printf("\n");Display(&L2);}if (&L_Merge.length != 0) {printf("\n");Display(&L_Merge);}system("pause");system("cls");goto start;case 3://插入元素printf("请输入你要插入数据的表格名称(L1,L2,L_Merge):");cin >> answer;if(answer=="L1")ListInsert(&L1);if (answer == "L2")ListInsert(&L2);if (answer == "L_Merge")ListInsert(&L_Merge);system("pause");system("cls");goto start;case 4:printf("请输入查找哪个表格的数据(L1,L2,L_Merge;注意区分大小写):");cin >> answer;if (answer == "L1")SearchDate(&L1);if (answer == "L2")SearchDate(&L2);if (answer == "L_Merge")SearchDate(&L_Merge);system("pause");system("cls");goto start;case 5:printf("请输入你要删除哪个表格中的数据(L1,L2,L_Merge;注意区分大小写):");cin >> answer;if (answer == "L1")DeleteDate(&L1);if (answer == "L2")DeleteDate(&L2);if (answer == "L_Merge")DeleteDate(&L_Merge);system("pause");system("cls");goto start;case 6://增加线性表printf("请输入数的个数:");scanf_s("%d", &L2.length);AddList(&L2, L2.length);system("pause");system("cls");goto start;case 7:ListMerge(&L1, &L2, &L_Merge);system("pause");system("cls");goto start;case 8:IniList(&L1, "1");IniList(&L2, "2");IniList(&L_Merge, "_Merge");system("pause");system("cls");goto start;case 0:printf("确定退出程序吗?(yes or no):");cin >> answer;if (answer == "yes"||answer=="YES")exit(0);if (answer == "no" || answer == "NO") {system("pause");system("cls");goto start;}}}return 0;
}

作者:New Bull

C/C++线性表的实现相关推荐

  1. 数据结构与算法——线性结构——线性表及其表示

    -"一,线性结构 1.顺序储存结构直接表示 多项式. 1).使用数组来表示多项式.(用数组下标来表示指数,值来表示系数) 可以表示成: 2).使用结构数组来表示.(把系数和指数看成一个二元组 ...

  2. 数据结构-线性表的顺序结构

    1 #include "stdio.h" 2 #include "stdlib.h" 3 4 typedef int ElemType; //线性表存储基本类型 ...

  3. 数据结构和算法:(3)3.2线性表的链式存储结构

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...

  4. 数据结构和算法:(3)3.1线性表的顺序存储结构

    -----------------------1.线性表基础操作------------------------ 线性表:(List)由零个或多个数据元素组成的有限序列. 首先他是一个序列,元素之间是 ...

  5. 数据结构与算法(2-1)线性表之顺序存储(顺序表)

    顺序表用数组存储数据元素(可以是结构体数组,也可以是结构体内的元素数组),插入和删除等等也是类似数组的操作. 顺序表优势: 1.无须为表示表中元素之间的逻辑关系而增加额外的存储关系,就是直接的顺序: ...

  6. c语言加法减法乘法,一元多项式的加法减法乘法c语言描述线性表应用

    一元多项式的加法减法乘法 --(c语言描述)线性表应用 来源:永远的北邮人 vc6.0下调试通过 #include #include #include #include #include #inclu ...

  7. 线性表List的基本创建

    #include <iostream> using namespace std; #include <malloc.h> #include <stdio.h> #d ...

  8. 数据结构之【线性表】(顺序表、链表的基本操作实现)

    概念 线性表:是N个数据元素的有限序列. 顺序表:用一组地址连续的存储单元依次存储[线性表 ]的数据元素.(区别于有序表:表中的数据元素存在非递增或非递减有序) 链表:用一组任意的存储单元来存储[线性 ...

  9. 线性表之顺序表(C语言实现)

    线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一 ...

  10. 带头结点的线性表的链式实现

    复习了顺序实现后,自己模仿着写了链式实现 /*** @author lirui 带头结点的线性表的链式实现*/ public class MyLinkList<T> {// 内部类LNod ...

最新文章

  1. java前端div浮动靠左_前端进阶第5周打卡题目汇总
  2. “无效数字” ;java.lang.Integer cannot be cast to java.lang.String
  3. 判断比较器Comparator和Comparable的升序降序问题
  4. 视图机制对于数据库的安全意义
  5. mysql中主从复制包括什么意思_Mysql主从复制作用和工作原理
  6. php比例算法,图片比例转换算法
  7. Swagger的描述注释配置详解
  8. 【Elasticsearch】 海量 分词器 在线地址 与文档
  9. spring mvc原理_SpringBoot:认认真真梳理一遍自动装配原理
  10. python编程语言-Python简史:开发者的小小副业如何成为全球最热编程语言?
  11. C语言冒泡排序三种写法,冒泡排序的三种实现方法
  12. 计算机联锁设备施工论文,毕业设计论文-计算机联锁设计
  13. 年龄怎么用计算机算,年龄计算器
  14. android开发论坛!关于Android开发的面试经验总结,含爱奇艺,小米,腾讯,阿里
  15. 如何用计算机求特征值特征向量,利用QR算法求解矩阵的特征值和特征向量
  16. VisualSVN Server安装失败解决
  17. TLS certificate verification has been disabled!
  18. 卡特兰数列(Catalan )
  19. 高精度加法 高精度减法 高度除法 高精度乘法 方法总结
  20. 广西大学计算机专业课代码,广西大学的代码是什么 广西大学代码

热门文章

  1. Centos7添加项目启动脚步到systemctl
  2. Mozilla系列——Mozilla的前世今生
  3. 便宜哭!戴尔官网竟然可以在线砍价直降3270,比双11还超值!
  4. 马化腾成功创业:在不确定中等待未来
  5. js将html页面转图片
  6. react中将html转成图片
  7. 皮肤检测算法三种,示例与代码
  8. C# 使用VS创建Windows窗体应用程序
  9. 【笨鸟先飞】Java重新学习日记10---多线程
  10. php 各种路由分析_php框架中的路由解析类