1.前言🙋🏼♂️
C语言想学好,链表和顺序表都跑不了.
2.顺序表🧣
2.1 顺序表概念🧣
顺序表是C语言中一种常用的数据结构,用于存储一组具有相同类型的元素。顺序表是一种线性表,即元素之间存在顺序关系,可以通过下标访问元素。
2.2 顺序表特点🧣
顺序表可以采用数组来实现,也可以使用动态内存分配来实现。无论采用哪种实现方式,顺序表都具有以下特点:
-
1. 随机访问:顺序表中的元素可以通过下标直接访问,具有O(1)的时间复杂度。
-
2. 内存连续:顺序表中的元素在内存中是连续存储的,这样可以有效利用计算机的缓存机制,提高访问效率。
-
3. 固定大小:使用数组实现的顺序表的大小是固定的,无法动态扩容或缩容。使用动态内存分配实现的顺序表可以动态调整大小。
-
4. 插入删除效率低:在顺序表的中间位置插入或删除元素需要移动后续元素,时间复杂度为O(n)。
2.2 顺序表作用🧣
在C语言中,可以通过定义结构体来表示顺序表,结构体中包含一个指向元素数组的指针,以及其他与顺序表相关的属性,例如当前元素个数和最大容量等。使用结构体可以更方便地管理和操作顺序表。
3.顺序表基操🧤
3.1 结构体初始化🎉
#include <stdio.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
ElemType length;
}sqlList;
sqlList *L;
3.2 顺序表初始化🎉
//初始化表
void initTable(sqlList *L){
printf("initTable:\n");
L->length = 0;
}
3.3 顺序表创建🎉
//创建表
void createTable(sqlList *L,ElemType number){
printf("createTable:\n");
int i;
printf("请输入%d个数据:\n",number);
if(L->length>MAXSIZE){
printf("顺序表已满");
}
for(i=0;i<number;i++){
scanf("%d",&L->data[i]);
}
L->length = i;
}
3.4 顺序表打印🎉
//显示表
void showTable(sqlList *L){
printf("showTable:\n");
int i;
for(i=0;i<L->length;i++){
printf("%d ",L->data[i]);
}
}
3.5 顺序表插入🎉
void insertTable(sqlList *L,ElemType pos,ElemType val){
printf("\ninserTable:\n");
int i;
if(L->length<MAXSIZE){
for(i=L->length-1;i>=pos-1;i--){
L->data[i+1] = L->data[i];
}
L->data[pos-1] = val;
L->length++;
}else{
printf("顺序表长度已满\n");
}
}
3.6 顺序表删除🎉
void deleteTable(sqlList *L,ElemType x){
printf("\n deleteTable: \n");
int i,j;
for(i=0;i<L->length;i++){
if(L->data[i] == x){
for(j=i;j<L->length;j++){
L->data[j] =L->data[j+1];
}
L->length--;
}
}
}
3.7 顺序表查找🎉
//查找元素
int queryTable(sqlList *L,ElemType x){
printf("\nqueryTable:\n");
int i,res;
i=0;
while(i<L->length && L->data[i] !=x)
i++;
if(i>=L->length)
return 0;
else
return i+1;
}
3.8 顺序表修改🎉
//修改元素
void updateTable(sqlList *L,ElemType findNuber,ElemType alterNuber){
int res = queryTable(L,findNuber);
int i;
L->data[res-1] = alterNuber;
printf("\nres = %d\n",res);
}
顺序表的C语言代码(全部 方法1):
#include <stdio.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
ElemType length;
}sqlList;
sqlList *L;
//初始化表
void initTable(sqlList *L){
printf("initTable:\n");
L->length = 0;
}
//创建表
void createTable(sqlList *L,ElemType number){
printf("createTable:\n");
int i;
printf("请输入%d个数据:\n",number);
if(L->length>MAXSIZE){
printf("顺序表已满");
}
for(i=0;i<number;i++){
scanf("%d",&L->data[i]);
}
L->length = i;
}
//显示表
void showTable(sqlList *L){
printf("showTable:\n");
int i;
for(i=0;i<L->length;i++){
printf("%d ",L->data[i]);
}
}
//插入一个数据
void insertTable(sqlList *L,ElemType pos,ElemType val){
printf("\ninserTable:\n");
int i;
if(L->length<MAXSIZE){
for(i=L->length-1;i>=pos-1;i--){
L->data[i+1] = L->data[i];
}
L->data[pos-1] = val;
L->length++;
}else{
printf("顺序表长度已满\n");
}
}
//删除一个元素
void deleteTable(sqlList *L,ElemType x){
printf("\n deleteTable: \n");
int i,j;
for(i=0;i<L->length;i++){
if(L->data[i] == x){
for(j=i;j<L->length;j++){
L->data[j] =L->data[j+1];
}
L->length--;
}
}
}
//查找元素
int queryTable(sqlList *L,ElemType x){
printf("\nqueryTable:\n");
int i,res;
i=0;
while(i<L->length && L->data[i] !=x)
i++;
if(i>=L->length) return 0;
else return i+1;
}
//修改元素
void updateTable(sqlList *L,ElemType findNuber,ElemType alterNuber){
int res = queryTable(L,findNuber);
int i;
L->data[res-1] = alterNuber;
printf("\nres = %d\n",res);
}
main()
{
initTable(&L);
createTable(&L,5);
showTable(&L);
insertTable(&L,3,60);
showTable(&L);
deleteTable(&L,60);
showTable(&L);
printf("下标:%d\n",queryTable(&L,20));
updateTable(&L,20,90);
showTable(&L);
}
以上代码演示了如何初始化、插入和删除元素,并打印顺序表的函数。代码中使用了一个结构体`sqlList `来表示顺序表,`data`数组存储元素,`length`记录当前元素个数。
顺序表的操作还包括查找指定位置的元素、查找指定值的元素、判断是否为空表等,以上代码仅是一个简单示例。在实际应用中,可以根据具体需求来扩展顺序表的功能,不过实际的开发和这个也差的不是很多,如果这个你能看懂,就基本上没有太大问题了
顺序表的C语言代码(全部 方法2):
//顺序表
#include <stdio.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct {
ElemType data[MAXSIZE];
ElemType length;
}SqlList;
void initTable(SqlList *sqlList){
printf("初始化成功\n");
sqlList->length =0;
return;
}
void createTable(SqlList *sqlList,ElemType n){
if(sqlList->length >MAXSIZE){
printf("顺序表已经满了\n");
return;
}
printf("请输入%d条数据:",n);
for (int i=0;i<n;i++){
scanf("%d",&sqlList->data[i]);
sqlList->length++;
}
printf("顺序表创建完毕");
}
void showTable(SqlList *sqlList){
for (int i = 0; i < sqlList->length; i++) {
printf(" %d -> ",sqlList->data[i]);
}
printf("显示完毕\n");
}
void addTable(SqlList *sqlList,ElemType x){
if(sqlList->length >MAXSIZE){
printf("顺序表已经满了\n");
return;
}
sqlList->data[sqlList->length] = x;
sqlList->length++;
showTable(sqlList);
printf("添加成功\n");
}
void alterTable(SqlList *sqlList,ElemType index,ElemType value){
sqlList->data[index] = value;
showTable(sqlList);
printf("修改成功\n");
}
ElemType queryTable(SqlList *sqlList,ElemType value){
printf("查找的元素是:%d\n",value);
int i=0;
while (i < sqlList->length && sqlList->data[i] !=value)
i++;
if(i>sqlList->length ) return 0;
else return i;
}
void deleteTable(SqlList *sqlList,ElemType value){
printf("删除的元素是:%d\n",value);
int i,flag=0;
for( i=0;i<sqlList->length;i++){
if(sqlList->data[i] == value){
for(int j=i;j<sqlList->length;j++){
sqlList->data[j] =sqlList->data[j+1];
flag = 1;
}
sqlList->length--;
}
}
if (flag){
printf("删除成功\n");
showTable(sqlList);
} else{
printf("数据没找到,删除失败\n");
}
}
void addPosTable(SqlList *sqlList,ElemType index,ElemType value){
if(sqlList->length<MAXSIZE){
for (int i = sqlList->length-1; i >=index-1 ; i--) {
sqlList->data[i+1] = sqlList->data[i];
}
sqlList->data[index-1]=value;
sqlList->length++;
printf("添加完毕\n");
showTable(sqlList);
}
printf("报错");
}
void main() {
// 1.顺序表 初始化
SqlList sqlList;
initTable(&sqlList);
//2.创建表
createTable(&sqlList,6);
//3.查看表
showTable(&sqlList);
//4.增加数据
addTable(&sqlList,3);
//5.修改数据 把下标为1 的修改为 8
alterTable(&sqlList,3,66);
//6.查找某一个值 返回对应的下标
printf("请输入要查找的元素:");
int temp;
scanf("%d",&temp);
printf("元素的下标%d\n",queryTable(&sqlList,temp));
//7.删除元素
deleteTable(&sqlList,1);
//8.在某一个位置插入一个元素
addPosTable(&sqlList,6,100);
printf("This is a C program!\n");
}