~~顺序表~~

article/2025/8/22 3:35:13

1.线性结构的特点是:

在数据元素的非空有限集中:

(1).存在唯一的一个被称为“第一个”的数据元素

(2).存在唯一的一个被称为“最后一个”的数据元素

(3).除第一个之外,集合中的每个数据元素都只有一个前驱

(4).除第一个之外,集合中每个集合数据元素都只有一个后继

线性表中数据元素必须是连续

2.线性表的定义

线性表是最常用且最简单的一种数据结构。一个线性表是n个数据元素的有限序列。至于每个元素的具体含义,在不同的情况下各不相同,它可以是一个整数或一个字符,也可以是更复杂的信息。

在稍复杂的线性表中,一个数据元素可以由若干个数据项组成。在这种情况下,常把数据元素称为记录,含有大量记录的线性表 又称文件。

线性表中数据元素的个数n(n>=0)定义为线性表的长度,n=0时又称空表。在非空表中的每个数据元素都有一个确定的位置,如a1是第一个数据元素,an是最后一个数据元素,ai是第i个数据元素,称i为数据元素ai在线性表中的位序。

位序也可从0开始。

3.线性表的顺序--表示和实现

线性表的顺序--表示指的是用一组地址连续的存储单元(内存)依次存储线性表的数据元素。

整型数组arr的存储表示 

 

线性表的这种在计算机内存中表示称做线性表的顺序存储结构或者顺序映像,这种存储结构的线性表为顺序表

特点:

1.数据元素在计算机内存"物理位置相邻"来表示线性表中数据元素之间的逻辑关系

2.只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取结构

C语言语言中的数组类型,具有连续存储空间和随机存取数据元素的特性,因此,通常都用数组来描述数据结构中的顺序存储结构

4.顺序表的设计

Seq_list.h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#include <iostream>using namespace std;typedef int Elem_Type;   //表中元素类型#define INIT_CAP   10      //表的初始容量typedef struct Seq_list
{Elem_Type *data;     //指向表内存空间的指针int capacity;        //表的容量int Curr_Cap;        //表的当前容量
}Seq_list;void Init_Seq_List(Seq_list *p_list);              //初始化表void Dest_Seq_List(Seq_list *p_list);              //摧毁表void Clear_Seq_List(Seq_list *p_list);             //清空表static int Get_Seq_List_Data_Count(const Seq_list *p_list);     //获取表中元素的个数static int Get_Seq_List_capacity(const Seq_list *p_list);       //获取表的容量bool Is_Empty_Seq_List(const Seq_list *p_list);          //判空bool Is_Full_Seq_List(const Seq_list *p_list);           //判满void Inc_Cap(Seq_list *p_list);                          //扩容void Print_Seq_List(const Seq_list *p_list);             //打印表中元素void Head_Insert(Seq_list *p_list, Elem_Type val); //头插void Tail_Insert(Seq_list *p_list, Elem_Type val); //尾插void Head_Delete(Seq_list *p_list);                //头删void Tail_Delete(Seq_list *p_list);                //尾删void Insert_Locat(Seq_list *p_list, int locat, Elem_Type val);    //指定位置插入void Delete_Locat(Seq_list *p_list, int locat);    //指定位置删除Elem_Type Get_Pos_Data(const Seq_list *p_list, int pos); //获取指定位置的元素static int Find_Val(const Seq_list *p_list, Elem_Type val);     //查询元素返回下标,第一次出现得该元素的下标bool Judge_Data(const Seq_list *p_list, Elem_Type val);  //判断元素是否在表中bool Delete_Data_Fir_Appear(Seq_list *p_list, Elem_Type val); //删除数据元素(首次出现)void Delete_Data_All_Req_Val(Seq_list *p_list, Elem_Type val); //删除所有与val相等的数据元素void Bubble_Sort(Seq_list *p_list);                //冒泡排序int Half_Query(Seq_list *p_list, Elem_Type val);   //折半查询

Seq_List_test.cpp 

#include "Seq_list.h"void Init_Seq_List(Seq_list *p_list)    //初始化
{assert(p_list != NULL);p_list->capacity = INIT_CAP;p_list->Curr_Cap = 0;p_list->data = (Elem_Type*)malloc(sizeof(Elem_Type)*INIT_CAP);if (p_list->data == NULL){printf("malloc申请失败!");return;}memset(p_list->data, 0, sizeof(Elem_Type)*INIT_CAP);
}void Dest_Seq_List(Seq_list *p_list)
{assert(p_list != NULL);p_list->Curr_Cap = 0;p_list->capacity = 0;free(p_list->data);p_list->data = NULL;
}void Clear_Seq_List(Seq_list *p_list)
{assert(p_list != NULL);p_list->Curr_Cap = 0;       //逻辑清空
}static int Get_Seq_List_Data_Count(const Seq_list *p_list)
{assert(p_list != NULL);return p_list->Curr_Cap;
}static int Get_Seq_List_capacity(const Seq_list *p_list)
{assert(p_list != NULL);return p_list->capacity;
}bool Is_Empty_Seq_List(const Seq_list *p_list)
{assert(p_list != NULL);return !(p_list->Curr_Cap);
}bool Is_Full_Seq_List(const Seq_list *p_list)
{assert(p_list != NULL);if (p_list->Curr_Cap == p_list->capacity){return true;}else{return false;}
}void Print_Seq_List(const Seq_list *p_list)
{assert(p_list != NULL);if (Is_Empty_Seq_List(p_list)){printf("表中无元素!\n");return;}printf("capacity:%d\n", p_list->capacity);printf("Curr_Cap:%d\n", p_list->Curr_Cap);for (int i = 0; i < p_list->Curr_Cap; i++){cout << p_list->data[i] << " ";}cout<<endl;
}void Head_Insert(Seq_list *p_list, Elem_Type val)
{assert(p_list != NULL);Insert_Locat(p_list, 0, val);
}void Tail_Insert(Seq_list *p_list, Elem_Type val)
{assert(p_list != NULL);int Cur_cap = Get_Seq_List_Data_Count(p_list);Insert_Locat(p_list, p_list->Curr_Cap, val);
}void Head_Delete(Seq_list *p_list)
{assert(p_list != NULL);Delete_Locat(p_list, 0);
}void Tail_Delete(Seq_list *p_list)
{assert(p_list != NULL);int Delete_Pos = Get_Seq_List_Data_Count(p_list) - 1;Delete_Locat(p_list, Delete_Pos);
}void Inc_Cap(Seq_list *p_list)
{assert(p_list != NULL);Elem_Type *tmp = (Elem_Type *)realloc(p_list->data, sizeof(Elem_Type)*p_list->capacity * 2);if (tmp == NULL){printf("扩容失败!");return;}p_list->data = tmp;p_list->capacity *= 2;
}void Insert_Locat(Seq_list *p_list, int locat, Elem_Type val)
{assert(p_list != NULL);if (Is_Full_Seq_List(p_list)){Inc_Cap(p_list);}if (locat<0 || locat>p_list->Curr_Cap){cout << "输入位置有误!\n";return;}int Currt_capa = Get_Seq_List_Data_Count(p_list);for (int i = Currt_capa; i > locat; i--){p_list->data[i] = p_list->data[i-1];}p_list->data[locat] = val;p_list->Curr_Cap++;
}void Delete_Locat(Seq_list *p_list, int locat)
{assert(p_list != NULL);if (Is_Empty_Seq_List(p_list)){printf("表中无元素!\n");return;}if (locat<0 || locat>=p_list->Curr_Cap){cout << "输入位置有误!\n";return;}for (int i = locat; i < p_list->Curr_Cap; i++){p_list->data[i] = p_list->data[i + 1];}p_list->Curr_Cap--;
}Elem_Type Get_Pos_Data(const Seq_list *p_list, int pos)
{assert(p_list != NULL);return p_list->data[pos];
}int Find_Val(const Seq_list *p_list, Elem_Type val)
{assert(p_list != NULL);if (Is_Empty_Seq_List(p_list)){printf("表中无元素!\n");return -1;}for (int i = 0; i < p_list->Curr_Cap; i++){if (p_list->data[i] == val){return i;}}printf("表中无该元素!\n");return -1;
}bool Judge_Data(const Seq_list *p_list, Elem_Type val)
{assert(p_list != NULL);int tag = Find_Val(p_list, val);return !(tag == -1);
}bool Delete_Data_Fir_Appear(Seq_list *p_list, Elem_Type val)
{assert(p_list != NULL);int pos = Find_Val(p_list, val);if (pos == -1){return false;}Delete_Locat(p_list,pos);return true;
}void Delete_Data_All_Req_Val(Seq_list *p_list, Elem_Type val)
{assert(p_list != NULL);
/** *********************************************  效率太低*  int judge = Find_Val(p_list, val);*	if (judge == -1)*	{printf("找不到此元素!\n");*		return;*	}*	for (int i = 0; i < p_list->Curr_Cap; i++)*	{*		if (p_list->data[i] == val)*		{*			Delete_Locat(p_list, i); *		}*	}* ** *********************************************/int j = -1;for (int i = 0; i < p_list->Curr_Cap; i++){if (p_list->data[i] != val){j += 1;p_list->data[j] = p_list->data[i];}}if (j == -1){printf("找不到此元素!\n");}else{p_list->Curr_Cap = j + 1;}
}void Bubble_Sort(Seq_list *p_list)
{assert(p_list != NULL);if (Is_Empty_Seq_List(p_list)){printf("表中无元素!\n");return;}for (int i = p_list->Curr_Cap - 1; i > 0; i--) //躺数{int tag = 1;for (int j = 0; j < i; j++){if (p_list->data[j + 1] < p_list->data[j]){Elem_Type tmp = p_list->data[j];p_list->data[j] = p_list->data[j + 1];p_list->data[j + 1] = tmp;tag = 0;}}if (tag){break;}}
}int Half_Query(Seq_list *p_list, Elem_Type val)       //二分查询第一次出现此元素的下标
{assert(p_list != NULL);Bubble_Sort(p_list);if (Is_Empty_Seq_List(p_list)){printf("表中无元素!\n");return -1;}int len = p_list->Curr_Cap;int left = 0;int right = len - 1;int mid = (right + left) / 2;while (left <= right){mid = (right + left) / 2;if (p_list->data[mid] == val){if (mid > left&&p_list->data[mid - 1] == val){right = mid - 1;}else{return mid;}}if (p_list->data[mid] < val){left = mid + 1;}if (p_list->data[mid] > val){right = mid - 1;}}printf("表中无此元素!\n");return -1;
}

main.cpp

#include "Seq_list.h"int main()
{Seq_list My_list;Init_Seq_List(&My_list);int arr[] = { 69, 12, 12, 34, 56, 12, 12, 89, 87,13,46 };int len= sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < len; i++){Tail_Insert(&My_list, arr[i]);}Print_Seq_List(&My_list);Delete_Data_All_Req_Val(&My_list, 12);Print_Seq_List(&My_list);Delete_Data_All_Req_Val(&My_list, 55);Bubble_Sort(&My_list);Print_Seq_List(&My_list);Tail_Delete(&My_list);Print_Seq_List(&My_list);Dest_Seq_List(&My_list);system("pause");return 0;
}

很成功! 嘻嘻~~~


http://chatgpt.dhexx.cn/article/LFGBoFik.shtml

相关文章

顺序表的定义

1.顺序表的定义 顺序表——用顺序存储的方式实现线性表顺序存储 eg: A1-A2-A3-A4-A5 如果第一个位置是location(L)&#xff0c;那么第二个就是location(L)数据元素大小 [sizeof(ElemType)可以查看数据元素大小] 2.顺序表的实现——静态分配 #define MaxSize 10 //定义最大长…

C语言实现顺序表

c语言实现顺序表 线性表是最简单的数据结构&#xff0c;而顺序表又是最简单的线性表&#xff0c;其基本思想是用一段地址连续的储存单元依次存储线性表的数据元素&#xff0c;比如我们常用的一维数组&#xff0c;下面代码实现了顺序表的定义以及基本操作。 编译环境&#xff…

顺序表的实现

目录 1.顺序表的概念 2.静态顺序表 分析&#xff1a; 3.动态顺序表 分析&#xff1a; 4.顺序表初始化 5.顺序表尾部操作 5.1尾插 空间检查函数实现 分析&#xff1a; 5.2尾删 分析&#xff1a; 6.顺序表的头部操作 6.1头插 分析&#xff1a; 6.2头删 分析&…

【C语言】顺序表的创建

一、代码实现部分&#xff1a; 1、顺序表是线性表的基础部分&#xff0c;至于顺序表&#xff0c;在本人看来无异于数组。至于线性表的概念&#xff0c;在此不再赘述。接下来尝试利用C语言对线性表中的顺序表进行代码实现&#xff08;此程序中规定用户输入的数据类型为int类型&a…

顺序表和链表

1.今天给大家介绍线性表中两个常见的结构顺序表和链表&#xff0c;其中链表又包括单链表和带头双向循环链表。 2.此部分的全部代码放在个人gitee中 &#xff0c;需要的自行拿取&#xff0c;前后文件依次对应SeqList SList DList。gitee链接点这里 一、线性表 1.线性表 线性表&…

顺序表的增删查改

数据结构 是数据存储的方式&#xff0c;对于不同的数据我们要采用不同的数据结构。就像交通运输&#xff0c;选用什么交通工具取决于你要运输的是人还是货物&#xff0c;以及它们的数量。 顺序存储结构 包括顺序表、链表、栈和队列等。 例如腾讯QQ中的好友列表&#xff0c;…

顺序表初始化

文章目录 1. 顺序表2. 顺序表的初始化 1. 顺序表 顺序表(顺序存储结构) 存储数据时&#xff0c;会提前申请一整块足够大小的物理空间&#xff0c;然后将数据依次存储到一整块连续的存储空间内&#xff0c;存储时做到数据元素之间不留一丝缝隙。 使用顺序表存储集合 {1,2,3,4,…

顺序表的创建

三个朋友今天全部上岸大厂&#xff0c;祝贺。&#xff08;太羡慕了&#xff09; 静态分配创建一个顺序表&#xff1b; 1.顺序表的定义&#xff1a; #define MaxSize 10 typedef struct {ElemType data[MaxSize];int length; }SqlList;这里我们用结构体的方式定义以一个顺序表…

顺序表的详解

线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串.... 即顺序表为线性表的一种&#xff0c; 顺序表是一种物理地址连续的存储单元依次存储数据元素的线性结构&#…

什么是顺序表

顺序表 在程序中&#xff0c;经常需要将一组&#xff08;通常是同为某个类型的&#xff09;数据元素作为整体管理和使用&#xff0c;需要创建这种元素组&#xff0c;用变量记录它们&#xff0c;传进传出函数等。一组数据中包含的元素个数可能发生变化&#xff08;可以增加或删…

数据结构——顺序表

目录 一. 什么是顺序表&#xff1f; 1&#xff0c;静态顺序表 2&#xff0c;动态顺序表 ①动态顺序表的实现及其初始化 ②空间的创建 ③顺序表的打印和销毁 ④顺序表的尾部插入和删除 ⑤顺序表的头部插入和删除 ⑥顺序表pos位置的插入和删除 ⑦顺序表指定元素的删除 二&am…

【数据结构】——顺序表介绍(独家介绍,小白必看!!)

重点和易错点都用彩笔标记出来了&#xff0c;放心食用&#xff01;&#xff01; 数据结构分为线性表和非线性表&#xff0c;今天我们要学习的顺序表就是线性表中的一个小类。那么&#xff0c;何为线性表&#xff0c;线性表是指n个具有相同性质的数据元素的有限序列&#xff0c…

顺序表详解

目录 一、线性表的概念 二、顺序表 1、顺序表的概念 1&#xff09;. 静态顺序表&#xff1a;使用定长数组存储元素。 2&#xff09;. 动态顺序表&#xff1a;使用动态开辟的数组存储。 三、接口实现 1、创建 2、初始化 3、扩容 4、尾插 5、打印 6、销毁 7、尾删 越界&…

php的strstr是什么意思,php strstr函数怎么用

strstr()函数是PHP中的一个内置函数&#xff0c;语法为strstr(string,search,before_search) &#xff0c;用于搜索字符串在另一字符串中是否存在&#xff0c;如果是&#xff0c;返回该字符串及剩余部分&#xff0c;否则返回 FALSE。此函数区分大小写。 php strstr()函数怎么用…

【数据结构】--- kmp算法和strstr函数

kmp算法和strstr函数 引言一、概念分析分析原理分析 KMP算法原理基本操作图解KMP原理 三、复杂度分析四、KMP算法代码 引言 现实生活中&#xff0c;字符串匹配在很多的应用场景里都有着极其重要的作用&#xff0c;包括生物信息学、信息检索、拼写检查、语言翻译、数据压缩、网…

实现strstr函数

strstr函数的作用是寻找子字符串在目标字符串中第一次出现的位置。 #include <stdio.h> #include<stdlib.h> #include<assert.h> const char * Strstr(const char * str1, const char * str2) {assert(str1 ! NULL);assert(str2 ! NULL);char* cur str1;ch…

字符串函数剖析(3)---strstr函数

1.strstr函数的巧妙 – 查找子字符串 1.1模拟实现strstr函数 strstr函数&#xff1a;在一个字符串中查找子串 学习新函数时&#xff0c;先去c库查找该函数的相关资料&#xff0c;更加助于你的学习 const char * strstr ( const char * str1, const char * str2 );先看函数…

C语言strstr()函数用法-字符串查找

1.函数定义 strstr()函数是一个参数为两个字符指针类型&#xff0c;返回值是char*类型的函数。 用于找到子串&#xff08;str2&#xff09;在一个字符串&#xff08;str1&#xff09;中第一次出现的位置&#xff08;不包括str2的串结束符&#xff09;&#xff0c;并返回该位置…

ConcurrentHashMap 实现原理

一. ConcurrentHashMap 是什么 在并发编程中&#xff0c;ConcurrentHashMap 是一个经常被使用的数据结构&#xff0c;相比于 Hashtable 以及Collections.synchronizedMap() 来说&#xff0c;ConcurrentHashMap 在线程安全的基础上提供了更好的写并发能力&#xff0c;同时还降低…

ConcurrentHashMap 详解

前言 ConcurrentHashMap。 以下的技术点都基于JDK1.8~ 基础回顾 我们都知道&#xff0c;从JDK1.8起&#xff0c;ConcurrentHashMap底层的数据结构就已经从原来的Segment分段锁变为了数组 链表 红黑树的形态。 它是一款并发容器&#xff0c;一款装数据的容器在并发环境下铁…