顺序表的创建,销毁,删除,插入,查找
本文是一篇关于顺序表的基本操作,创建,销毁,查找,插入,删除,阅读大约5分钟,希望能帮你更理解顺序表
关于顺序表:
顺序表是一种数据结构,它采用线性存储方式将数据元素按照元素值的大小依次存储在一段连续的地址空间中。顺序表通过数组来实现,数组中的每个元素对应一个数据元素,通过数组下标可以方便地访问任意位置的数据元素。顺序表具有随机存取的特点,即可以快速地访问任意位置的数据元素。顺序表也具有插入和删除操作复杂度较高的缺点,因为当需要插入或删除某个位置的数据元素时,可能需要移动大量的元素来保持数组中元素的连续性。
顺序表的创建和销毁:
定义了一个 SqList结构体来表示顺序表,其中包含一个 data 数组用于存储数据,以及一个 length变量表示当前顺序表的长度。我们还定义了一个 createEmptyList函数用于创建一个空的顺序表。在main函数中,我们调用 createEmptyList函数创建一个空的顺序表,并输出其长度.接下来,我们调用destroyList函数来销毁顺序表,并输出一条消息表示顺序表已被销毁。最后,程序返回0表示正常退出。
//顺序表的创建并销毁
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100 //定义顺序表的最大长度
typedef struct{
int data[MAX_SIZE];
int length;
}Sqlist;
//创建一个顺序表
Sqlist*creatEmptyList(){
Sqlist*list=(Sqlist*)malloc(sizeof(Sqlist));
if(list==NULL){
printf("内存分布失败");
exit(1);
}
list->length=0;
return list;
}
//销毁顺序表
void destroyList(Sqlist*L){
if(L!=NULL){
free(L->data); //释放存储数据的内存空间
free(L); //释放顺序表结构体所占用的内存空间
}
}
int main(){
Sqlist*list=creatEmptyList();
printf("顺序表以创建,当前长度为%d\n",list->length);
destroyList(list); // 销毁顺序表
printf("顺序表已经销毁\n");
return 0;
}
顺序表的查找:
该程序首先定义了一个结构体 SqList
,用于表示顺序表。在该结构体中,包含一个整型数组 data
和一个整型变量 length
,分别用于存储数据和记录顺序表的当前长度。程序中还定义了一个函数 Search
,用于在顺序表中查找指定元素的位置。该函数接受一个指向 SqList
结构体的指针和一个目标元素作为参数,返回值为目标元素在顺序表中的位置。如果找不到目标元素,则返回-1。在主函数中,程序首先让用户输入顺序表的长度和元素值,然后调用 Search
函数查找目标元素的位置,并输出结果。
//顺序表的查找
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 定义顺序表的最大长度
typedef struct {
int data[MAXSIZE]; // 存储数据的数组
int length; // 顺序表的当前长度
} SqList;
//在顺序表中查找指定元素位置
int Search(SqList*L,int target){
int i;
for(i=0;i<L->length;i++){
if(L->data[i]==target){
return i;//返回元素在顺序表中的位置
}
}
return -1; //没有找到目标元素返回-1
}
int main(){
SqList L={{1,2,3,4,5},5} ; //在main函数中预先定义一个顺序表
int target=3; //要查找的目标元素
int pos=Search(&L,target); //调用search函数查找目标元素的位置
if(pos==-1){
printf("目标元素不在顺序表中");
}
else{
printf("目标函数在顺序表中的位置为%d\n",pos);
}
return 0;
}
顺序表的插入:
- 这个函数在给定的顺序表的指定位置插入一个元素。
- 如果位置无效或顺序表已满,它会打印错误信息并返回-1。
- 如果位置有效,它将元素插入到指定的位置,并将之后的所有元素后移一位。最后,它会更新顺序表的长度并返回0。
//顺序表的插入
#include<stdio.h>
#define MAX_SIZE 100 //假设顺序表最大容量
struct SeqList {
int data[MAX_SIZE];
int length;
};
//顺序表的指定位置插入元元素
int insert(struct SeqList* list, int position, int element) {
if (list == NULL || position<0 || position>list->length || list->length >= MAX_SIZE)
{
printf("插入位置无效或顺序表位置已满");
return -1;
}
if (list->length == MAX_SIZE) {
printf("位置已满,无法插入新的元素");
return -1;
}
//将postion之后的元素后移一位
for (int i = list->length - 1; i >= position; i--) {
list->data[i + 1] = list->data[i];
}
//在position位置插入元素
list->data[position] = element;
list->length++;//长度加一
return 0;
}
//打印顺序表中的元素
void printfList(struct SeqList list) {
printf("顺序表中的元素为:");
for (int i = 0; i < list.length; i++) {
printf("%d", list.data[i]);
}
printf("\n");
}
int main() {
struct SeqList myList = { {1,3,5,7,9},5 };//初始化一个顺序表
printf("插入前:\n");
printfList(myList);
int position = 2; //要插入的位置
int element = 10;//要插入的元素
if (insert(&myList, position, element) == 0) {
printf("插入后:\n");
printfList(myList);
}
return 0;
}
顺序表的删除:
定义了一个 SqList
类型来表示顺序表,其中 data
数组用于存储数据元素,length
表示顺序表的长度。deleteElem
函数用于删除顺序表中第 i
个元素,具体实现方式是将第 i
个元素后面的所有元素向前移动一个位置,然后将顺序表长度减 1。在 main
函数中,我们初始化一个顺序表 L
,然后调用 deleteElem
函数来删除其中的第 i
个元素,并输出删除后的顺序表。
//顺序表的删除
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100 //顺序表的最大长度
typedef struct{
int data[MAXSIZE];
int length;
}Sqlist; //顺序表类型
//删除顺序表中第i个元素,成功返回1,失败返回0
int deleteElem(Sqlist*L,int i){
if(i<1||i>L->length){ //判断i是否合法
return 0;
}
for(int j=i;j<L->length;j++){
//将第i个元素后面的所i有元素向前移动一个位置
L->data[j-1]=L->data[j];
}
L->length--; //顺序表长度减1
return 1;
}
int main(){
Sqlist L={{1,2,3,4,5},5};//初始化顺序表
int i=2; //要删除的下标元素
if(deleteElem(&L,i)){ //删除元素
printf("要删除的第%d个元素成功,顺序表变为:",i);
for(int j=0;j<L.length;j++){
printf("%d",L.data[j]);
}
printf("\n");
}
else{
printf("删除第%d个元素失败\n",i);
}
return 0;
}