【数据结构基础笔记】【顺序表】

代码参考《妙趣横生的算法.C语言实现》

文章目录

  • 前言
    • 1、创建顺序表
    • 2、顺序表插入元素
    • 3、顺序表删除元素
    • 4、顺序表实例分析
      • 1、静态
      • 2、动态
    • 5、顺序表总结


前言

本章总结:从静态和动态分别进行顺序表的创建、插入、删除、以及实例分析


1、创建顺序表

1、静态地生成一张顺序表

#define MaxSize=100;
ElemType Sqlist[MaxSize];
int len;
//len表示顺序表的长度

2、动态地生成一张顺序表

#define MaxSize 10typedef int ElemType;	typedef struct{int *elem;		//指向顺序表首地址elemint length;		//顺序表中表的长度(元素个数)int listsize;	//顺序表的存储空间容量
}Sqlist;
void initSqlist(Sqlist* L)
{L->elem = (int*)malloc(MaxSize*sizeof(ElemType));	//开辟内存,并将该段空间首地址赋值给L->elemif (!L->elem){printf("分配内存失败");exit(0);}						//如果分配内存失败,返回L->length = 0;										//生成一张空的顺序表L->listsize = MaxSize;
}

静态定义,表占用的内存空间开辟在内存的静态区,也就是函数栈上,该区域的从内存空间会随着函数调用的完成而被系统自动回收。动态生成一个顺序表,内存空间开辟在内存的动态区上,也就是堆内存上,这个区域的内存空间不会被系统自动回收,需要程序主动释放.

2、顺序表插入元素

在长度为n的顺序表中的第i个位置插入新元素item

1、静态表

void InsertElem(ElemType Sqlist[],int &n,int i,ElemType item)
{//向顺表中Sqlist中第i个位置插入元素item,顺序表原长为nint t;if(n==MaxSize || i<1 ||i>n+1)	exit(0);	//非法插入:判断插入元素的位置是否对,或者表是否已满,因为表的内存大小是固定不变的。for(t=n-1;t>=i-1;t--)	Sqlist[t+1]=Sqlist[t];		//将i-1后的元素往后移动一个元素Sqlist[i-1]=item;				//在i位置上插入元素itemn=n+1;							//数组长度+1
}

2、动态表,如果顺序表已满,可以追加一段内存空间

void InsertElem(Sqlist* L, int i, ElemType item)
{//向顺序表L中第i个位置插入元素itemElemType* base, * insertPtr, * p;if (i<1 || i>L->length + 1){printf("非法插入");exit(0);}	//非法插入if (L->length >= L->listsize){base = (ElemType*)realloc(L->elem, (L->listsize + 10) * sizeof(ElemType));//重新追加空间L->elem = base;		//更新内存基地址L->listsize = L->listsize + 100;		//存储空间增大100单元}insertPtr = &(L->elem[i - 1]);		//insertPtr为插入位置for (p = &(L->elem[L->length - 1]);p >= insertPtr;p--)*(p + 1) = *p;						//将i-1以后的元素顺序往后移动一个元素位置*insertPtr = item;					//在第i个位置插入元素L->length++;
}

3、顺序表删除元素

删除第i个位置元素的方法:将第i个位置以后的元素依次前移,从而覆盖掉第i个元素

1、静态表

void DelElem(ElemType Sqlist[],int &n,int i)
{int j;if(i<1 || i>n) exit(0);		//非法删除、for(j=i;j<n;j++)Sqlist[j-1]=Sqlist[j];//将第i个位置以后的元素依次前移n--;		//表长-1
}

2、动态表

void DelElem(Sqlist* L, int i)
{ElemType* delItem, * q;if (i<1 || i>L->length){printf("非法删除");exit(0);}delItem = &(L->elem[i - 1]);	//delItem指向表中第i个元素q = L->elem + L->length - 1;			//q指向表尾for (++delItem;delItem <= q;++delItem)*(delItem - 1) = *delItem;		//将第i位置以后的元素依次前移L->length--;				//表长-1
}

4、顺序表实例分析

1、静态

题目要求:
创建一个静态的顺序表存放整数,大小为10,完成以下操作:
1、输入6个整数,打印出顺序表中的内容,并显示表中剩余的空间个数
2、在顺序表中第3个位置插入元素0,打印出顺序表中的内容,并显示表中剩余的空间个数
3、试图向表中第11个位置插入整数0,程序提示超出范围
4、删除表中的第6个元素,打印出顺序表中的内容,并显示表中剩余的空间个数

#include "stdio.h"
#define MaxSize 10//基本操作//
//向顺序表中插入元素  Sqlist:表首地址 *len:表的长度  i:待插入元素的位置 x:待插入元素的元素值
void insertElem(int Sqlist[], int* len, int i, int x)
{int t;if (i<1 || i> * len + 1 || *len == MaxSize)	//非法插入操作,或者数组元素已满{printf("This insert is illegal\n");return;}for (t = *len - 1;t >= i - 1;t--)Sqlist[t + 1] = Sqlist[t];Sqlist[i - 1] = x;			//插入元素*len = *len + 1;
}
//向顺序表中删除元素 Sqlist:表首地址	*len:表的长度 i:插入元素的位置
void DelElem(int Sqlist[], int* len, int i)
{int j;if (i<1 || i>*len){printf("This insert is illgel\n");return;}for (j = i;j <= *len - 1;j++)Sqlist[j - 1] = Sqlist[j];*len = *len - 1;
}
void show_sqlist(int Sqlist[],int len)
{int i = 0;for (i = 0;i < len;i++)printf("%d", Sqlist[i]);
}
//测试函数
int main()
{int Sqlist[MaxSize];	//定义一个静态顺序表int len=0;int i;printf("please input six interger number\n");for (i = 0;i < 6;i++){scanf("%d", &Sqlist[i]);len++;}show_sqlist(Sqlist, len);printf("\nthe spare length is %d\n", MaxSize - len);insertElem(Sqlist, &len, 3, 0);show_sqlist(Sqlist, len);insertElem(Sqlist, &len, 11, 0);		//在表中第11位置插入整数0DelElem(Sqlist, &len, 6);show_sqlist(Sqlist, len);printf("\nthe spare length is %d\n", MaxSize - len);return 0;
}

result:
在这里插入图片描述

2、动态

编写一个程序,动态的创建一个顺序表。
要求:
1、顺序表初始长度为10,向顺序表中输入15个整数,并打印出来
2、再删除顺序表中的第五个元素,打印出删除后的结果

/*
编写一个程序,动态的创建一个顺序表。
要求:
1、顺序表初始长度为10,向顺序表中输入15个整数,并打印出来
2、再删除顺序表中的第五个元素,打印出删除后的结果
*/
#include "stdio.h"
#include "conio.h"
#include "malloc.h"
#include <stdlib.h>
#define MaxSize 10typedef int ElemType;	typedef struct{int *elem;		//指向顺序表首地址elemint length;		//顺序表中表的长度(元素个数)int listsize;	//顺序表的存储空间容量
}Sqlist;//初始化一个顺序表
void initSqlist(Sqlist* L)
{L->elem = (int*)malloc(MaxSize*sizeof(ElemType));	//开辟内存,并将该段空间首地址赋值给L->elemif (!L->elem){printf("分配内存失败");exit(0);}						//如果分配内存失败,返回L->length = 0;										//生成一张空的顺序表L->listsize = MaxSize;
}
/*
L:Sqlist类型指针
i:插入元素的位置
item:插入的元素
*/
void InsertElem(Sqlist* L, int i, ElemType item)
{//向顺序表L中第i个位置插入元素itemElemType* base, * insertPtr, * p;if (i<1 || i>L->length + 1){printf("非法插入");exit(0);}	//非法插入if (L->length >= L->listsize){base = (ElemType*)realloc(L->elem, (L->listsize + 10) * sizeof(ElemType));//重新追加空间L->elem = base;		//更新内存基地址L->listsize = L->listsize + 100;		//存储空间增大100单元}insertPtr = &(L->elem[i - 1]);		//insertPtr为插入位置for (p = &(L->elem[L->length - 1]);p >= insertPtr;p--)*(p + 1) = *p;						//将i-1以后的元素顺序往后移动一个元素位置*insertPtr = item;					//在第i个位置插入元素L->length++;
}
/*
L:Sqlist类型指针
i:删除元素的位置
*/
void DelElem(Sqlist* L, int i)
{ElemType* delItem, * q;if (i<1 || i>L->length){printf("非法删除");exit(0);}delItem = &(L->elem[i - 1]);	//delItem指向表中第i个元素q = L->elem + L->length - 1;			//q指向表尾for (++delItem;delItem <= q;++delItem)*(delItem - 1) = *delItem;		//将第i位置以后的元素依次前移L->length--;				//表长-1
}
void print_list(Sqlist *L)
{int i = 0;for (i = 0;i < L->length;i++)printf("%d  ",L->elem[i]);
}
//测试函数
int main()
{Sqlist L;int i = 0;initSqlist(&L);for (i = 0;i < 15;i++)InsertElem(&L,i+1,i+1);     //每次在末尾插入一个元素printf("\n the content of list is \n");print_list(&L);DelElem(&L, 5);printf("\n the content of list after delete is \n");print_list(&L);_getche();return 0;
}

在这里插入图片描述

5、顺序表总结

线性表的优点:构造简单、操作方便,通过顺序表的首地址(数组名)可直接对表进行随机存取,从而存取速度快,系统开销小。
缺点:有可能浪费存储空间,在插入或删除一个元素时,需要对插入或删除位置后面的所有元素逐个进行移动,从而导致操作效率较低。
所以顺序表适用于表的长度不经常发生变化的场合,如批处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于《加密与解密》的读后感----对dump脱壳的一点思考

偶然翻了一下手机日历&#xff0c;原来今天是夏至啊&#xff0c;时间过的真快。ISCC的比赛已经持续了2个多月了&#xff0c;我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦&#xff0c;但感觉还是很幸运的&#xff0c;能在大三的时候遇到ISCC&#xff0c;不管怎样&…

【数据结构基础笔记】【链表】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、链表基础2、创建一个链表3、插入结点4、删除结点5、销毁链表6、实例分析前言 本章总结&#xff1a;链表的定义、创建、销毁&#xff0c;结点的插入与删除 1、链表基础 链表的物理存储结构是用一组地址任意的存储单元存储…

视频图像质量评价

目录1、人眼视觉特性1、眼的适应性2、对比灵敏度3、空间分辨率和时间分辨率4、马赫效应5、可见度阈值2、图像质量测度3、图像评价方法4、图像评价方法的优劣1、人眼视觉特性 1、眼的适应性 暗适应性&#xff1a;从亮环境到暗环境&#xff0c;适应暗环境的特性 亮适应性&#…

recovery编译问题汇总

1、修改支持USB大容量存储 &#xff08;1&#xff09;、首先需要查看手机lun位置 手机链接电脑&#xff0c;打开cmd命令行&#xff0c;依次输入以下命令: adb shell find /sys -name "lun" 输出以下结果&#xff1a; 发现手机输出结果有两个&#xff0c;需要进一步查…

【数据结构基础笔记】【栈】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、栈的定义2、创建一个栈3、入栈和出栈操作4、栈的清空、销毁、计算栈的当前容量5、实例分析前言 本章总结&#xff1a;栈的定义、创建栈&#xff0c;销毁栈&#xff0c;入栈出栈操作等操作。 1、栈的定义 栈是一种重要的…

用HTML语言制作list标记,html5 datalist标签的用法是什么?这里有datalist标签的用法实例...

本篇文章主要为大家讲述了关于html5 datalist标签的用法及html5 datalist标签的用法实例。本文说了两个常用的选项框的实例供大家选择观看&#xff0c;下面就让我们一起来看这篇文章吧我们先来看看html5 datalist标签的用法&#xff1a;标签定义选项列表。请与input元素配合使用…

【数据结构基础笔记】【队列】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、队列定义2、创建一个队列3、入队列4、出队列5、销毁一个队列6、循环队列的概念7、循环队列的实现8、实例分析前言 本章总结&#xff1a;链队列定义&#xff0c;创建&#xff0c;出队入队操作&#xff0c;销毁操作&#x…

html图片自动循环轮播图,js实现图片无缝循环轮播

本文实例为大家分享了js实现图片无缝循环轮播的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下代码如下Document#container{overflow:hidden;width:400px;height:300px;margin:auto;}#front,#container{display:flex;flex-direction:row;}#container img{width:400px…

五、json模块

一、json模块的介绍 json模块是Python自带的模块&#xff0c;用于json和Python数据之间的相互转换 Json与Python数据类型的对应关系 JsonPythonobjectdictarrayliststringstrnumber(int)int,longnumber(real)floattrueTruefalseFalsenullNone [#中括号括起来的&#xff0c;对…

【数据结构基础笔记】【树】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、树的概念2、二叉树3、二叉树的遍历4、创建二叉树5、实例分析前言 本章总结&#xff1a;树的概念、二叉树的创建、遍历 1、树的概念 树结构是以分支关系定义得一种层次结构。 树的定义&#xff1a;树是由n(n>0)个结点…

可以自动撑起的html样式,好好玩:CSS3抖动样式CSS Shake让你的网页酷炫起来

之前在一些网站发现了一个好玩的样式&#xff0c;就是鼠标移到网站LOGO上&#xff0c;logo会自动抖动起来&#xff0c;显得非常炫酷。我也是十分感兴趣。自从本站新添加了一个视觉设计的分类之后&#xff0c;我也是想起来有个抖动CSS样式CSS Shake&#xff0c;所以今天给小伙伴…

爬虫项目(一)---采集最近一日世界各国的疫情数据信息

该内容出自黑马程序员教程 采集最近一日世界各国疫情数据 步骤&#xff1a; 发送请求&#xff0c;获取疫情首页从疫情首页中提取最近一日各国疫情字符串从最近一日各国疫情字符串中提取json格式字符串把json格式字符串转换为Python类型把Python类型的数据&#xff0c;以json…

【数据结构基础应用】【顺序表】

代码参考《妙趣横生的算法.C语言实现》、《剑指OFFER 名企面试官精讲典型编程题 第2版》等 文章目录前言1、合并两个顺序表前言 本章总结在看书过程中的一些关于顺序表的算法题并可能含有一些自己的一些疑问。题目数量不定&#xff0c;随阅历增加而增加&#xff1b; 1、合并两…

html上下滚动切换顶端tab,jQuery实现Tab菜单滚动切换的方法

本文实例讲述了jQuery实现Tab菜单滚动切换的方法。分享给大家供大家参考。具体如下&#xff1a;这是一款jQuery实现让你的Tab菜单滚动的代码,先运行一下看看效果咋样?是不是超不错,让你的网页变得灵动起来,不再静止,学习jquery的朋友也可作为范例来参考吧.运行效果截图如下&am…

[转载]十四步实现拥有强大AI的五子棋游戏

又是本人一份人工智能作业……首先道歉&#xff0c;从Word贴到Livewrter&#xff0c;好多格式没了&#xff0c;也没做代码高亮……大家凑活着看……想做个好的人机对弈的五子棋&#xff0c;可以说需要考虑的问题还是很多的&#xff0c;我们将制作拥有强大AI五子棋的过程分为十四…

爬虫项目(二)---采集从03月02号以来的世界各国疫情数据

该内容出自黑马程序员教程 采集从03月02号以来的世界各国疫情数据 步骤&#xff1a; Ⅰ&#xff0c;重构项目(一)的代码&#xff0c;以提高扩展性 把功能封装到一个类中每一个小功能变成一个方法通过run方法启动爬虫 import requests import re import json from bs4 impor…

【原创】StreamInsight查询系列(二十)——查询模式之检测间隙事件

上篇文章介绍了查询模式中如何检测异常事件&#xff0c;这篇博文将介绍StreamInsight中如何检测间隙事件。 测试数据准备 为了方便测试查询&#xff0c;我们首先准备一个静态的测试数据源&#xff1a;// 创建数据源&#xff0c;要注意的是4:16和4:30之间存在的事件间隙 var sou…

【数据结构基础应用】【查找和排序算法】

代码参考《妙趣横生的算法.C语言实现》 文章目录前言1、顺序查找2、折半查找3、直接插入排序4、选择排序5、冒泡排序6、希尔排序7、快速排序8、堆排序9、排序算法性能比较10、所有算法的code&#xff08;C语言&#xff09;前言 本章总结查找和排序算法&#xff1a;顺序查找、折…

爬虫项目(三)---采集最近一日全国各省疫情数据

该内容出自黑马程序员教程 采集最近一日全国各省疫情数据 当然&#xff0c;数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url&#xff1a;https://ncov.dxy.cn/ncovh5/view/pneumonia 思路&#xff1a;首先需要先确定全国各省疫情数据的位置 全国各省份的疫情数据…

计算机专业博士后排名,排名丨计算机专业领域TOP10,性价比超高!

原标题&#xff1a;排名丨计算机专业领域TOP10&#xff0c;性价比超高&#xff01;相信各位家长、同学已经看过太多专业的排名&#xff0c;我问过很多理科生将来想学什么专业&#xff0c;听到频率最高的还是计算机专业。似乎大家都知道&#xff0c;学计算机是比较挣钱的&#x…