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

代码参考《妙趣横生的算法.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,一经查实,立即删除!

相关文章

ubuntu安装oracle unzip: No such file or directory

$ln -s /usr/bin/unzip /你的oracle11安装目录/install/unzip$sudo chmod 777 /usr/bin/unzip转载于:https://www.cnblogs.com/qm4050/archive/2011/08/25/2241466.html

一、网络爬虫概述

1&#xff0c;浏览器与网络爬虫的区别 答&#xff1a; 对于浏览器而言&#xff1a;浏览器打开一个网站&#xff0c;会对网站服务器发送一个request请求&#xff0c;服务器收到该请求之后&#xff0c;会给浏览器一个respond响应&#xff0c;该响应携带很多数据&#xff0c;之后…

百度android广告sdk下载,IS_Freedom

美数广告 SDK接入流程1.嵌入广告SDK将 sdk-android-demo/app/libs 中的 meishu-sdk_xxx_release.aar、open_ad_sdk_xxx.aar、Baidu_MobAds_SDK-release-xxx.aar、GDTSDK.unionNormal.xxx.aar、msa_mdid_1.0.13 拷贝到项目的 libs 下&#xff0c;对应的 build.gradle 文件里面添…

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

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

java vector_Java Vector elements()方法与示例

java vector向量类elements()方法 (Vector Class elements() method) elements() method is available in java.util package. elements()方法在java.util包中可用。 elements() method is used to get an enumeration of the elements that exist in this Vector. elements()方…

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

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

动态添加,删除行之心理测试系统

动态添加&#xff0c;删除行之考试系统 数据库设计&#xff1a; xl_option 题目选项 20090105134755404(编号) 20090105134904421(外键) 比较符合(选项内容) ②(选项标号) 2&#xff08;选项分值&#xff09; xl_subject 题目信息 20090105134943608&#xff08;编号&#xff…

android bitmap裁剪中间,Android裁剪中心位图

虽然上面的大多数答案提供了一种方法来实现这一点&#xff0c;但已经有一种内置的方法来实现这一点&#xff0c;它是一行代码(ThumbnailUtils.extractThumbnail())int dimension getSquareCropDimensionForBitmap(bitmap);bitmap ThumbnailUtils.extractThumbnail(bitmap, di…

二、request请求库

一、requests介绍与安装 1&#xff0c;requests介绍 答&#xff1a;requests是一个优雅且简单的Python HTTP请求库 2&#xff0c;requests作用 答&#xff1a;requests的作用是发送请求获取响应数据 3&#xff0c;requests安装 答&#xff1a;pip install requests 二、…

Java Vector Capacity()方法与示例

向量类的Capacity()方法 (Vector Class capacity() method) capacity() method is available in java.util package. Capacity()方法在java.util包中可用。 capacity() method is used to return the current capacity (i.e. initially, how many object exists) of this Vecto…

MFC和GTK的区别

关键技术 http://blog.csdn.net/master_max/article/details/1540204 MFC和GTK的区别&#xff1f;&#xff1f; 1.  两者都是基于面向对象设计的。尽管MFC是用C写的&#xff0c;而GTK是用C写的&#xff0c;但思想都是面向对象的。GTK使用glib的对象机制&#xff0c;由于用C写…

视频图像质量评价

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

鸿蒙科技与文化,数字阅读 | “华为鸿蒙”:当现代科技遇到古典文化

华为事件愈演愈烈。海思芯片 20 年 " 备胎 " 终转正&#xff0c;那么操作系统呢&#xff1f;最近&#xff0c;华为为自主研发的操作系统注册商标—— " 鸿蒙 "&#xff0c;引发了关于华为注册整本《山海经》的热烈讨论&#xff0c;很多人的朋友圈&#xff…

三、Beautiful Soup解析库

一、Beautiful Soup介绍与安装 1&#xff0c;Beautiful Soup介绍 答&#xff1a;Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库 2&#xff0c;Beautiful Soup安装 答&#xff1a;安装Beautiful Soup 4&#xff1a;pip install bs4 安装lxml&#xff1a;pip…

strictmath_Java StrictMath sqrt()方法与示例

strictmathStrictMath类sqrt()方法 (StrictMath Class sqrt() method) sqrt() Method is available in java.lang package. sqrt()方法在java.lang包中可用。 sqrt() Method is used to find the square root of the given parameter in the method. Here, "sqrt" st…

recovery编译问题汇总

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

言语理解每日学习及精解20110831

【例题】天气预报一般要考虑气温、气压、温度、风力等因素&#xff0c;这些都是大气层本身变化的结果&#xff0c;只要掌握这些因素&#xff0c;通过计算机的计算就能准确地预报天气变化的趋势。沙尘暴作为一种特殊的天气现象&#xff0c;同样要考虑上述气象因素。据气象学家分…

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

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

四、正则表达式

一、正则表达式的概念和作用 正则表达式概念&#xff1a;一种字符串匹配的模式 正则表达式作用&#xff1a; 可以检查一个字符串中是否包含某种字串替换匹配的字串提取某个字符串中匹配的字串 二、正则表达式中常见的语法 字符描述原样字符匹配字符一般字符匹配自身beyondb…

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

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