【C语言】顺序表的创建

article/2025/8/22 5:15:03

一、代码实现部分:

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

typedef struct{int *p;int length;int ac;
}S,*pS;

首先定义一个结构体,结构体中定义一个指针变量,两个int类型变量,之所以定义两个int类型变量length和ac是为了分别记录顺序表的规定长度(申请长度)和实际长度(已使用的长度,或者说已经存放了个元素个数)。

        2、在定义好结构体后,进行对顺序表的创建。在此利用函数void crate_s(pS s);进行对顺序表的创建

void crate_s(pS s){int a;printf("你想要存储多少个数据?\n");scanf("%d",&a);if(a<=0){printf("你不想存储数据!\n");}else{s->p=(int *)malloc(sizeof(int)*a);if(NULL==s->p){printf("空间申请失败!\n");}else{s->length=a;s->ac=-1;printf("能够存储%d个元素的空间申请成功!\n",s->length);}}
}

当结构体传入函数void crate_s(pS s);后,先判断用户是否想创建顺序表,要创建多长的顺序表。当用户想要创建顺序表后,向计算机申请相应空间,并且结构体中的length用于记录顺序表的规定(申请)长度,ac用于记录顺序表的实际长度。

        3、通过void insert_s(pS s);函数实现顺序表中添加数据,具体代码如下:

void insert_s(pS s){int a,b,c,d,e,i;a=s->length;b=s->ac;c=a-(b+1);if(a==0){printf("你还没有创建顺序表!\n");}else if(c==0){printf("此表已满!\n");}else{printf("这个顺序表长度为%d,你还可以存%d个数据,你想存多少数据?\n",a,c);scanf("%d",&d);if(d==0){printf("你不想存数据!\n");}else if(c<d){printf("此顺序表空间不足!\n");}else{for(i=0;i<d;i++){printf("请输入第%d个元素:\n",i+1);scanf("%d",&e);s->p[++(s->ac)]=e;printf("元素输入成功!\n");}}}
}

这个函数的编程思想是先判断是否已经创建顺序表,顺序表是否已经存满数据。然后判断用户想要输入的数据个数是否存在溢出情况,最后再存放用户想要存放的数据。

        4、通过void trave_s(pS s);函数实现顺序表数据的遍历,具体代码如下:

void trave_s(pS s){int a,b,c,i;a=s->length;b=s->ac;if(a==0){printf("你还没创建顺序表!\n");}else{if(b==-1){printf("这是一个空表!\n");}else{printf("顺序表中数据是:\n");for(i=0;i<=b;i++){printf("%4d",s->p[i]);}printf("\n");}}
}

此函数的编程思想是先判断顺序表是否存在,是否为空,若都不是,那么遍历这个顺序表中实际存在的数据(这里注意区分顺序表的规定长度与实际长度)。

        5、通过void search_s(pS s);函数实现对顺序表元素的查询,具体代码如下:

void search_s(pS s){int a,b,c,i;a=s->length;b=s->ac;if(a==0){printf("你还没有创建顺序表!\n");}else{if(b==-1){printf("这是一个空表!\n");}else{printf("此顺序表有%d个元素,你想查询几号元素?\n",b+1);scanf("%d",&c);if(c<=0||c>(b+1)){printf("你找的元素不在此顺序表中表中");}else{printf("你要找的第%d号元素是%d \n",c,s->p[c-1]);}}}
}

在这里,仍然是先判断顺序表是否存在,是否为空,然后按照序号查找元素。若查找的方式是输入元素,查看其是否在顺序表中,那么本人的实现方法是利用最笨的遍历查找,将顺序表中的元素一一取出和输入元素相互比较以此找出此元素和次元素所在位置。

        6、利用void change_s(pS s);函数实现修改顺序表数据,具体代码如下:

void change_s(pS s){int a,b,c,d,i;a=s->length;b=s->ac;if(a==0){printf("你还没有创建顺序表!\n");}else{if(b==-1){printf("这是一个空表!\n");}else{printf("此顺序表有%d个元素,你想修改几号元素?\n",b+1);scanf("%d",&c);if(c<=0||c>(b+1)){printf("你修改的元素不在此顺序表中表中\n");}else{printf("你要修改的第%d号元素是%d,你想将其修改成什么数值? \n",c,s->p[c-1]);scanf("%d",&d);s->p[c-1]=d;printf("元素修改成功!\n");}}}
}

先判断顺序表是否存在,顺序表是否为空,然后找到想要修改的元素下标,对对应的值进行修改。

        7、利用void empty_s(pS s);函数实现将顺序表置空:

void empty_s(pS s){int a,b,c;a=s->length;b=s->ac;if(a==0){printf("你还没有建表!\n");}else{if(b==-1){printf("这是一个空表!\n");}else{s->ac=-1;printf("此表已经置空!\n");}}
}

同样先判断存在,判断是否为空,再进行置空。(小想法:这个置空倒是特别简单,将记录顺序表真实长度的ac变量值置为-1即可,那么在改变ac变量值之前已经在相应位置赋好的值怎么办?个人主观理解为,这些值会被其他(无论是否是人为操作)值覆盖,因此不用关心这些值的下场(无知的奸笑))。

        8、利用void delete_s(pS s);函数实现删除顺序表中数据:

void delete_s(pS s){int a,b,c,d;a=s->length;b=s->ac;if(a==0){printf("你还没有建表!\n");}else{if(b==-1){printf("这是一个空表!\n");}else{printf("你想要删除第几号元素?\n");scanf("%d",&c);if(c<=0||c>b+1){printf("你要删除的元素不在此顺序表中!\n");}else{d=c-1;printf("你要删除的第%d号元素是%d\n",c,s->p[d]);for(d;d<=b;d++){s->p[d]=s->p[d+1];}s->ac--;printf("此元素删除成功!\n");}}}
}

同样,判存在,判空。因为此处是以元素在顺序表中的位置来定位元素,因此要判断要删除的元素是否在顺序表中。然后再做删除操作(指定元素的后面覆盖前面,ac-1)

        9、利用void init_s(pS s);函数实现向顺序表中插入数据,具体代码如下:

void init_s(pS s){int a,b,c,d,e,f;a=s->length;b=s->ac;if(a==0){printf("你还没有建立顺序表!\n");}else{if(b==-1){printf("这是一个空表!\n");}else{if(a==b+1){printf("此表以满!\n");}else{printf("你想在数据前面插入新数据还是想在数据后面插入新数据?选择前插请输入0,选择后插请输入1:\n");scanf("%d",&c);switch(c){case 0:printf("此顺序表一共可以存储%d个元素,目前已经存储了%d个元素,你想在几号元素前面插入数据?\n",a,b+1);scanf("%d",&d);e=d-1;if(d<=0||d>b+2){printf("此表中没有这号元素,你无法插入");}else{for(e;e<=b;b--){s->p[b+1]=s->p[b];}printf("你想在%d号元素前面添加什么数值?\n",d);scanf("%d",&f);s->p[e]=f;s->ac++;printf("元素添加成功!\n");}break;case 1:printf("此顺序表一共可以存储%d个元素,目前已经存储了%d个元素,你想在几号元素后面插入数据?\n",a,b+1);scanf("%d",&d);if(d<0||d>b+1){printf("此表中没有这号元素,你无法插入");}else{for(d;d<=b;b--){s->p[b+1]=s->p[b];}printf("你想在%d号元素后面添加什么数值?\n",d);scanf("%d",&f);s->p[d]=f;s->ac++;printf("元素添加成功!\n");}break;default:printf("你不想输入数据!\n");break;}}}}
}

判断表是否存在,是否为空。判断是要前插还是后插。保证插入数据后数据不会溢出。

        10、利用void thong_s(pS s);函数得到顺序表的长度,具体代码如下:

void thong_s(pS s){int a,b,c;a=s->length;b=s->ac;if(a==0){printf("你还没有建表!\n");}else{if(b==-1){printf("这是一个空表!\n");}else{printf("此链表长度为%d",1+b);}}
}

判断表是否存在,是否为空,返回结构体中真实记录顺序长度的ac+1值,因为ac初值是从-1开始。

        11、接下来就来实现应用一个基本框架将这些基本功能串联起来,构成一个简单的顺序表小程序。基本框架如下:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h> //引入函数库                           typedef struct{int *p;int length;int ac;
}S,*pS;          //定义结构体                            //声明各个功能函数void main(){int a=1,b;S s;s.length=0;while(a){system("cls");printf("\n\n\t\t顺序表基本操作\n");printf("\t\t...1-n.顺序表的各种功能操作;  \n");printf("\t\t...0.退出;  \n");printf("\n\n");printf("\t\t请选择[0,9]: ");scanf("%d",&b);printf("\n\n");switch(b){case 1-n:调用各种功能函数     ;break;case 0:  a=0                 ;break;}if(b!=0){printf("请输入任意键继续:\n");getche();}}system("cls");printf("\t\t程序结束\n");exit(-1);
}//具体的各种功能函数  

这基本框架就是一个基本表单。

二、结果展示部分:

小程序运行结果如下:

1. 程序开始运行界面

2. 申请存储空间,即创建顺序表。

3. 向顺序表中添加元素。

4. 展示顺序表中元素。

5. 向顺序表中再次添加元素。

6.展示再次添加元素后的顺序表内容。

7.在已有顺序表中插入元素。

8.展示已经插入元素后的顺序表。

 9. 修改指定位置的元素内容

10. 展示已经修改好的顺序表内容。

        在此仅仅展示这几个简单功能,剩余功能也能正常实现。目前发现的不足之处在于,每次实现某一功能前总是要写出先判断顺序表是否存在、是否为空的代码,这些代码显得很冗余,因此可以尝试将这些代码写入一个新函数,在实现某一功能先调用此函数即可。

以上是本人对顺序表的C语言代码初步实现,不喜勿喷,感谢理解。

相关链接:

【C语言】单链表的创建_lixxkv的博客-CSDN博客


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

相关文章

顺序表和链表

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;一款装数据的容器在并发环境下铁…

ConcurrentHashMap介绍

引言 学习ConcurrentHashMap&#xff0c;合理的问题顺序应该如下&#xff1a; ConcurrentHashMap是什么&#xff08;WHAT&#xff09;为什么要有ConcurrentHashMap&#xff08;WHY&#xff09;ConcurrentHashMap的实现原理&#xff08;HOW&#xff09;ConcurrentHashMap如何使…

一文彻底弄懂ConcurrentHashMap

一文彻底弄懂ConcurrentHashMap 导读前言锁synchronizedvolatile&#xff08;非锁&#xff09;自旋锁分段锁ReentrantLockCAS ConcurrentHashMap 实现原理JDK1.7 中的 ConcurrentHashMapSegmentConcurrentHashMap 并发读写的几种情况get 方法put 方法 JDK1.8 中的 ConcurrentHa…

ConcurrentHashMap杂谈

为什么使用ConcurrentHashMap 在并发编程中使用HashMap可能导致程序死循环&#xff0c;而使用线程安全的HashTable效率又非常低下 线程不安全的HashMap 在多线程环境下&#xff0c;使用HashMap进行put操作会引起死循环&#xff0c;导致CPU利用率接近100% 死循环案例&#xf…

图解ConcurrentHashMap

曾经研究过jkd1.5新特性&#xff0c;其中ConcurrentHashMap就是其中之一&#xff0c;其特点&#xff1a;效率比Hashtable高&#xff0c;并发性比hashmap好。结合了两者的特点。 集合是编程中最常用的数据结构。而谈到并发&#xff0c;几乎总是离不开集合这类高级数据结构的支…