文章目录

  • 一、顺序表
  • 二、链表

一、顺序表

初始化、赋值、插入、删除、输出、有序合并

#include <iostream>
#include <string>using namespace std;typedef int ElemType;#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10/*数组定义*/
typedef struct {ElemType* elem;//首地址int length;//当前长度int listsize;//容量
}SqList;/*初始化*/
SqList InitList_Sq(SqList& L) {L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));//存储分配失败if (!L.elem) {exit(-2);}//空表L.length = 0;//初始化存储容量L.listsize = LIST_INIT_SIZE;return L;//cout << "初始化成功!";
}//创建顺序表 赋值
SqList setList_Sq(SqList& L) {int length;cout << "请输入此顺序表长度:";cin >> length;L.length = length;cout << "请以此输入顺序表中元素的值:";for (int i = 0; i < L.length; i++) {cin >> L.elem[i];}return L;
}/*插入*/
int ListInsert_Sq(SqList& L, int i, ElemType e) {//插入的i不合法if (i<1 || i>L.length + 1) {return -1;//cout << "插入位置不合法";}//容量不够,增加分配if (L.length >= L.listsize) {ElemType* newbase = (ElemType*)(realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType)));if (!newbase) {exit(-2);//cout << "存储分配失败";}L.elem = newbase;//新基址L.listsize += LISTINCREMENT;//增加容量}int* q = &(L.elem[i - 1]);//插入位置及之后的元素向后移for (int* p = &(L.elem[L.length - 1]); p >= q; p--) {*(p + 1) = *(p);}//插入新的元素*q = e;//表长更新++L.length;return 1;//cout << "插入成功";
}/*删除*/
int ListDelete_Sq(SqList& L, int i, ElemType& e) {if ((i < 1) || (i > L.length)) {//cout << "删除位置不合法";return 0;}int* p = &(L.elem[i - 1]);e = *p;int* q = L.elem + L.length - 1;for (++p; p < q; ++p) {*(p - 1) = *p;}--L.length;return 1;
}//输出顺序表
void printLisq_Sq(SqList L) {for (int i = 0; i < L.length; i++) {cout << L.elem[i] << " ";}
}/*顺序表的合并*/
void MergeList_Sq(SqList La, SqList Lb, SqList& Lc)
{ElemType* pa = La.elem;ElemType* pb = Lb.elem;Lc.listsize = Lc.length = La.length + Lb.length;ElemType* pc = Lc.elem = (ElemType*)malloc(Lc.listsize * sizeof(ElemType));if (!Lc.elem) exit(OVERFLOW);ElemType* pa_last = La.elem + La.length - 1;ElemType* pb_last = Lb.elem + Lb.length - 1;while ((pa <= pa_last) && (pb <= pb_last)){if (*pa <= *pb) *pc++ = *pa++;else *pc++ = *pb++;}while (pa <= pa_last) *pc++ = *pa++;while (pb <= pb_last) *pc++ = *pb++;
}int main()
{SqList  l;l = InitList_Sq(l);ElemType e1, e2;cout << "原始顺序表为:";printList(l);cout << "请输入要添加的元素的值:" << endl;cin >> e1;int i, j;cout << "请输入要添加的元素的位置:" << endl;cin >> i;if (ListInsert_Sq(l, i, e1)) {cout << "插入成功!" << endl;cout << "新的顺序表为:" << endl;printList(l);}cout << "请输入你要删除的元素的位置:" << endl;cin >> e2;cout << "请输入你要删除的元素的值:" << endl;cin >> j;if (ListDelete_Sq(l, j, e2)) {cout << "删除成功!" << endl;cout << "新的顺序表为:" << endl;printList(l);}/*顺序表的合并*/SqList la, lb, lc;la = setList_Sq(la);lb = setList_Sq(lb);MergeList_Sq(la, lb, lc);printLisq_Sq(lc);return 0;}

二、链表

#include <iostream>
using namespace std;#define ERROR 0
#define OK 1typedef int ElemType;
typedef int Status;/*链表数据结构*/
typedef struct LNode {ElemType data;      // Data Fieldstruct LNode* next; // Pointer (Link) Field
}LNode, * LinkList;/*创建*/
LinkList CreatList_L(int n) //尾插法
{LinkList L, r, p;r = L = (LinkList)malloc(sizeof(LNode));for (int i = 1; i <= n; i++){p = (LinkList)malloc(sizeof(LNode));cout << "请输入链表第" << i << "个元素的值:" << endl;cin >> p->data;r->next = p;r = p;}r->next = NULL;return L;
}
/*增 插入*/
Status ListInsert_L(LinkList& L, int i, ElemType e)
{ //在带头结点单链表第 i 个结点前插入新元素x LinkList p = L;int j = 0;while (p && j < i - 1){p = p->next;j++;} //找第 i-1个结点if (!p || j > i - 1)return ERROR;LinkList s = (LinkList)malloc(sizeof(LNode));//创建新结点,其数据为x s->data = e;s->next = p->next;p->next = s;return OK;
}
/*删*/
Status ListDelete_L(LinkList& L, int i, ElemType& e)
{ //在单链表中删除第 i 个结点LinkList p = L;int j = 0;while (p->next && j < i - 1){p = p->next; ++j;} //找第 i-1 个结点if (!(p->next) || j > i - 1)return ERROR;LinkList q = p->next;p->next = q->next; //重新链接e = q->data;free(q); //释放q结点return OK;
}/*改*//*查*/
int LocateElem_L(LinkList L, ElemType e)
/*在单链表L中查找值为x的结点,找到后返回其指针,否
则返回空*/
{int i = 0;LinkList p;p = L->next;while (p != NULL && p->data != e){p = p->next; // 向后查找i++;}return  i + 1;
}/*输出链表*/
void put(LinkList L) {while (L->next!=NULL){cout << L->next->data;L = L->next;}cout << endl;}int main()
{int n;cout << "输入要建立的链表中元素的个数:";cin >> n;cout << endl;LinkList L = CreatList_L(n);cout << "新建的链表如下: " ;put(L);int choose = 1;while (choose){     cout << "=================================" << endl;cout << "|             1.查找             |" << endl;cout << "|             2.删除             |" << endl;cout << "|             3.插入             |" << endl;cout << "|             0.退出             |" << endl;cout << "=================================" << endl;cout << "请输入你的选择:";cin >> choose;switch (choose){case 1:ElemType e;cout << "请输入要查找的元素的值为:";cin >> e;cout << "所查找元素的位置为: " << LocateElem_L(L, e) << endl;break;case 2:int i;cout << "请输入要删除的元素的位置: ";cin >> i;ElemType e2;cout << "请输入要删除的元素的值: ";cin >> e2;if (ListDelete_L(L, i, e2)) {cout << "删除成功!" << endl;cout << "链表更新为:";put(L);}else{cout << "删除失败!" << endl;};break;case 3:int i3;cout << "请输入要插入的位置:";cin >> i3;int e3;cout << "请输入要插入的元素的值:";cin >> e3;if (ListInsert_L(L, i3, e3)) {cout << "插入成功!" << endl;}else {cout << "插入失败!" << endl;}cout << "链表更新为:";put(L);break;case 0:break;}}return 0;
}

线性表的实现及其基本操作相关推荐

  1. 数据结构(C语言)——线性表(定义,基本操作)

    数据结构(C语言)--线性表(定义,基本操作) 一. 线性表的定义 二.线性表的基本操作 什么时候要传入引用"==&=="----对参数的修改结果需要"==带回来 ...

  2. 2.1 线性表的定义和基本操作

    目录 思维导图 线性表的定义 线性表的基本操作 思维导图 数据结构的三要素:逻辑结构.数据的运算.存储结构. 线性表的定义 线性表的基本操作

  3. (王道408考研数据结构)第二章线性表-第一节:线性表的定义和基本操作

    文章目录 一:线性表的定义 二:线性表的基本操作 一:线性表的定义 线性表(Linear List):零个或多个数据元素的有限序列 元素之间是有顺序的 若元素存在多个,则第一个元素无前驱,最后一个元素 ...

  4. 脚踏实地《数据结构第二章》第一节:线性表的定义和基本操作

    考点分析 一:线性表的定义(数据结构三要素–逻辑结构) 定义:线性表是具有相同数据类型的n(n>0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表. 相同:每个数据元素所占空间一 ...

  5. 线性表之单链表基本操作

    单链表的定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针. ...

  6. 线性表的创建和基本操作

    &&逻辑与 ||逻辑或 线性表是最基本.最简单.也是最常用的一种数据结构. 线性表结构中,数据元素之间通过一对一首位相接的方式连接起来. 具体实现时,线性表可 以采用不同的存储策略. ...

  7. 线性表:链表的基本操作

    线性表的链式存储方式: 用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).因此,为了表示每个数据元素与其后继元素的逻辑关系,除了本身数据信息之外,还需要存储一个指 ...

  8. 线性表顺序存储结构的基本操作(C++)

    头文件引入 #define MAXSIZE 100 #define OVERFLOW -2 #define OK 1 #define ERROR -1 #define TRUE 1 #define F ...

  9. mysql 线性表_线性表之顺序存储,基本操作

    /* 九大基本操作(不同的存储结构实现的代码不同) 此处用一维数组的动态分配: InitList(&L);//初始化表, Length(L); LocateElem(L,e); GetElem ...

  10. 线性表之顺序存储,基本操作

    2019独角兽企业重金招聘Python工程师标准>>> /* 九大基本操作(不同的存储结构实现的代码不同) 此处用一维数组的动态分配: InitList(&L);//初始化表 ...

最新文章

  1. 一文告诉你,如何使用Python构建一个“谷歌搜索”系统 | 内附代码
  2. IntelliJ IDEA 安装go插件
  3. linux shell 获取字符串最后一个字符 去掉字符串最后一个字符 去掉末尾一个字符 去掉末尾两个字符
  4. kingcms php 下载,KingCMS _KingCMS官方网站
  5. 对NUnitAddIn做了下修改
  6. Behavioral模式之Memento模式
  7. 计算机在音乐教学的应用论文开题报告,音乐教育论文开题报告(范文详解)
  8. Linux 系统管理
  9. asp.net写验证码
  10. mybatis模糊查询sqlserver和mysql的写法
  11. jsp中的九大内置对象和四大作用域
  12. 国产各数据库厂商数据库梳理
  13. 讲座记录《捷联惯导解算的历史及发展》
  14. 《统计学》第八版贾俊平第九章分类数据分析知识点总结及课后习题答案
  15. Python 调用JSON接口实例
  16. 2022-06-14 QThread CPU压力测试
  17. o2o是什么营销模式c语言求幂函数,O2O营销模式的特点是什么,o2o模式的运营方式...
  18. SpringBoot海景房出租管理系统+代码讲解
  19. 尚德机构营收同比大涨22.9%,高增长可持续吗?
  20. python编译器报错:“RecursionError: maximum recursion depth exceeded in comparison”解决方案

热门文章

  1. java适配器模式 场景_Java设计模式之《适配器模式》及应用场景
  2. 基因在细胞系当中的表达数据库,CCLE使用简述
  3. 湖南铁路科技职业技术学院计算机等级,湖南铁路科技职业技术学院——高速铁路动车乘务专业...
  4. matlab做pca人脸识别,[转载]一个修改后的PCA进行人脸识别的Matlab代码,识
  5. 计算机视觉与深度学习 | 对恐怖袭击事件记录数据的量化分析(附源代码):博主的机器学习首秀(研究生数学建模二等奖)
  6. 通过ping命令测试主机与虚拟机之间是否连通
  7. mysql+性能优化+命令_MySQL性能优化
  8. 4由通道检测_十堰城区108处桥隧通道接受全面“体检”将持续至8月底
  9. 整理:C++中sprintf()函数的使用详解
  10. VC++ 获取系统时间的方法汇总