数据结构代码实现(C语言)——顺序表定义、插入、删除、查找

1.顺序表定义(静态分配)

基本操作

        InitList(&L):初始化表。构造一个空的线性表。

        用静态数组定义顺序表。由于数组的大小和空间已固定,一旦空间占满,再加入新的数据就会产生溢出。

// 顺序表定义——静态分配 
#include <stdio.h> 

#define MaxSize 10 // 定义最大长度

typedef struct {
	int data[MaxSize]; // 数组存储线性表
	int length; // 定义表长 
}SqList;

// 初始化,初始值为0
void InitList(SqList *L) {
	int i;
	for(i=0; i<MaxSize; i++) {
		L->data[i] = 0;
	}
	L->length = 0;
} 

int main() {
	SqList L;
	InitList(&L);
	int i;
	for(i=0; i<MaxSize; i++) {
		printf("%d,",L.data[i]); 
	}
	return 0;
}

补充

1、C语言关于结构体做参数传递:

https://blog.csdn.net/lin37985/article/details/38582027

若想在函数内改变结构体的值,需要给函数传递结构体的地址

用&L做实参,&L是结构体变量L的地址。在调用函数时将该地址传送给形参L(L是指针变量)。这样L就指向实参。

2、值传递与地址传递

        值传递:这种方式使用变量、常量、数组元素作为函数参数,实际是将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同的存储单元。

        地址传递:这种方式使用数组名或者指针作为函数参数,传递的是该数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,这种传递方式称为“参数的地址传递”。

准确定义:

        int *p;        p =  &x;        或

        int *p = &x;

        *p代表x地址处具体存放的数据;p代表x的地址值;&x代表x的地址值;x代表x地址处具体存放的数据。

3、结构体.与->的区别

看调用者的类型,如果调用者是指针,就在它后边用 ->;如果它不是地址,就在它后边就用 .

2.顺序表定义(动态分配)

基本操作

        InitList(&L):初始化表。构造一个空的线性表。

        采用动态分配内存的方式定义顺序表。

        存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用来替换原来的存储空间,从而达到扩充存储数组空间的目的。原来的数据整体复制到新数组内。

// 顺序表定义——动态分配
#include<stdio.h>
#include<malloc.h>

#define InitSize 10 // 定义初始长度

typedef struct {
	int *data; //数据头指针
	int MaxSize; //数据最大容量
	int length; //数组长度 
}SqList;

void InitList(SqList *L) {
	L->data = (int*)malloc(InitSize * sizeof(int)); // 动态分配内存 
	L->MaxSize = InitSize;
	int i;
	for(i=0; i<L->MaxSize; i++) 
		L->data[i] = 0; // 设置默认值
	L->length = 0; 
} 

void IncreaseSize(SqList *L) {
	int *p = L->data;
	L->data = (int*)malloc((L->MaxSize+InitSize)*sizeof(int));
	int i;
	for(i=0; i<L->length; i++) {
		L->data[i] = p[i]; 
	}
	L->MaxSize = L->MaxSize + InitSize;
	for(i=L->length; i<L->MaxSize; i++) {
		L->data[i] = 0;
	}
	free(p);
}

int main() {
	SqList L;
	InitList(&L); // 初始化数组 
	// 赋值0-9
	int i;
	for(i=0; i<L.MaxSize; i++) {
		L.data[i] = i;
		L.length++;
	} 
	for(i=0; i<L.MaxSize; i++) {
		printf("%d,", L.data[i]);
	}
	printf("\n");
	if(L.length == L.MaxSize)
		IncreaseSize(&L);
	for(i=0; i<L.MaxSize; i++) {
		printf("%d,", L.data[i]);
	}
	return 0;
}

 3.顺序表插入

基本操作

        ListInsert(&L, i ,e):在顺序表的第i个位置插入e 


//插入元素 ListInsert(&L, i ,e)
 
#include<stdio.h>
#include <stdbool.h>
#define MaxSize 10
 
typedef struct {
	int data[MaxSize]; //静态类型定义结构体 
	int length;
}SqList; 
 
//初始化顺序表 
void InitList(SqList *L) {
	for(int i=0; i<MaxSize; i++) 
		L->data[i] = 0; //表内元素初始化为0 
	L->length = 0;
}
 
bool ListInsert(SqList *L, int i, int e) { //在第i个位置插入e 
	if(L->length >= MaxSize) { //合法性验证 
		printf("顺序表已满"); 
		return false;
	}
	if(i<1 || i>L->length+1) {
		printf("输入不合法");
		return false;
	}
	
	for(int j=L->length; j>=i; j--) //定位 
		L->data[j] = L->data[j-1]; //后移 
	L->data[i-1] = e; //插入 
	L->length++;
	return true;
}
 
int main() {
	SqList L;
	InitList(&L); //初始化数组 
	for(int i=0; i<8; i++) { //给数组赋值【1-9】 
		L.data[i]=(i+1);
		L.length++;
	}
	for(int i=0; i<L.length; i++) //查看插入前的顺序表 
		printf("%d ",L.data[i]);
	printf("\n");
	bool result = ListInsert(&L, 4, 14); //在第4个位序插入14 
	for(int i=0; i<L.length; i++)
		printf("%d ",L.data[i]);
	return 0;
}

4.顺序表删除

基本操作

         ListDelete(&L,i,&e):删除第i个元素,并取回删除的值

//顺序表删除 ListDelete(&L,i,&e)
 
#define MaxSize 10
#include<stdio.h>
#include <stdbool.h>
 
typedef struct { //定义数组结构体 
	int data[MaxSize];
	int length;
}SqList;
 
//初始化顺序表 
void InitList(SqList *L) {
	for(int i=0; i<MaxSize; i++) //数组内元素置为0 
		L->data[i] = 0;
	L->length = 0;
}
 
//顺序表删除 
bool ListDelete(SqList *L, int i, int *e) { //删除第i个元素,并取回删除的值 
	if(i<1||i>L->length) 
		return false;
	*e = L->data[i-1]; //查找 
	for(int j=i; j<L->length; j++) //移位 
		L->data[j-1] = L->data[j]; 
	L->length--;
	return true;
}
 
int main() {
	SqList L;
	InitList(&L); //初始化顺序表 
	for(int i=0; i<8; i++) { //将顺序表赋值为【1-8】 
		L.data[i]=(i+1);
		L.length++;
	}
	int e = -1;
	if(ListDelete(&L, 3, &e)) //删除顺序表第3位元素,并返回该元素的值 
		printf("已删除元素%d ", e);
	else 
		printf("删除失败!"); 
	return 0; 
}

5.顺序表按位查找

基本操作

         GetElem(&L,i):查找第i位元素的值,并获取该值

//按位查找 GetElem(L,i)
 
#define MaxSize 10
#include<stdio.h>
 
typedef struct { //结构体数组定义顺序表 
    int data[MaxSize];
    int length; 
}SqList; 
 
//初始化顺序表 
void InitList(SqList *L) { //将顺序表初始化为0 
    for(int i=0; i<MaxSize; i++) 
        L->data[i] = 0;
    L->length = 0;
}
 
//函数的默认返回值就是int型
int GetElem(SqList *L, int i) { //查找第i位元素 
    return L->data[i-1]; //返回第i位元素的值 
}
 
int main() {
    SqList L;
    InitList(&L);
    for(int i=0; i<8; i++) { //顺序表赋值位【0-7】 
        L.data[i] = i;
        L.length++;
    }
    int e = GetElem(&L, 4); //查找第4位元素的值 
    printf("%d",e);
}

6.顺序表按值查找

基本操作

        LocateElem(&L, e):在顺序表中查找第一个值为e的元素,并返回其位序

//顺序表按值查找
 
# define MaxSize 10 
#include<stdio.h>
 
typedef struct{ //结构体定义顺序表 
	int data[MaxSize]; //数组 
	int length;
}SqList;
 
//初始化顺序表 
void InitList(SqList *L) { //将顺序表置为0 
	for(int i=0; i<MaxSize; i++) {
		L->data[i] = 0;
	}
	L->length = 0;
} 
 
//在顺序表中查找第一个值为e的元素,并返回其位序 
int LocateElem(SqList *L, int e) { 
	for(int i=0; i<L->length; i++)
		if(L->data[i] == e) 
			return i+1;
}
 
int main() {
	SqList L;
	InitList(&L);
	for(int i=0; i<8; i++) { //给顺序表赋值【8-1】 
		L.data[i] = 8-i;
		L.length++;
	}
	int Elem = 3;
	int d = LocateElem(&L, Elem);
	printf("%d", d);
}
  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值