数据结构(一)顺序表的C实现

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100 //静态顺序表的默认长度 
typedef int DateType;

//定义结构体(相当于Java类) , 
typedef struct {
	DateType data[MaxSize];//自定义类型数组,默认长度为MaxSize 100 
	int length;
}SeqList; 

//初始化顺序表中的数据,默认有效长度为0 
void InitList(SeqList * L){
	L->length = 0;
	//默认初始值,防止内存有脏数据
	for(int i=0;i<MaxSize;i++){
		L->data[i] = 0;
	} 
	printf("初始化顺序表成功!\n"); 
}

//以数组的形式作为参数传入,并初始化到结构体数组中 
int CreateList(SeqList * L,DateType a[],int n){
	//参数数组的长度不能大于默认结构体数组的长度MaxSize,
	//此处可以实现动态扩容,即是在做插入操作时就要判断结构体数组是否满,满则主要扩容 
	if(n>MaxSize){
		printf("顺序表的空间不够,无法建立顺序表\n");
		return 0;
	}
//	将数组中的元素复制到列表中,n是参数数组的长度 
	for(int i=0;i<=n-1;i++){
		L->data[i] = a[i]; 
	}
	L->length = n; 
	printf("创建线性表成功!\n"); 
	return 1;
}

//判断结构体数组是否为空 
int isEmpty(SeqList * L){
	if(L->length == 0){
		return 1;
	}else{
		printf("该顺序表不为空!");
		return -1;
	}
}

//返回结构体数组实际长度 
int Length(SeqList * L){
	return L->length;
}

//遍历结构体数组中的有效数据 
void foreach(SeqList * L){
	printf("列表中的数据有:");
	for(int i=0;i<=L->length-1;i++){
		printf("%d ",L->data[i]);
	}
	printf("\n");
}

//按值查找
DateType searchByValue(SeqList * L,DateType value) {
	for(int i=0;i<=L->length-1;i++){
		if(	L ->data[i] == value){
			return L->data[i];
			break;
		}
	}
	printf("类表中没有该元素!"); 
	return -1;
}

//按索引index查找,使用指针带回当前索引数据 
void indexOf(SeqList * L,int index,DateType * ptr){
	if(index >= L ->length || index < 0){
		printf("索引不合法,查找失败!"); 
	}else
	* ptr = L->data[index];
	
}

//插入数据,index是位序,不是索引,索引从零开始 
bool insert(SeqList * L,int index,DateType value){
	//判断该位序是否合法 位序大于0小于结构体数组的有效长度length 
	if(index >L->length||index<1){
		//TODO
		printf("插入位置非法禁止插入!"); 
		return false;
	}
	//要插入元素前必须先实现,指定索引index-1后的元素都向后移动一位
	//插入先从后移动,删除从从当前索引移动 
	for(int i=L->length;i>=index;i--){
		//TODO
		L->data[i] = L->data[i-1];
	}
	L->data[index-1] = value;
	L->length++;
	return true;
}

bool deleteByValue(SeqList * L,DateType value){
	//根据值找到元素得到索引坐标
	int temp=-1; 
	for(int i = 0;i<L->length;i++){
		if(L->data[i]==value){
			temp = i;
			break;
		}
	}
	//将当前索引之后的元素向前移动一位 
	if(temp != -1){
		for(int i=temp;i<=L->length-1;i++){
			L->data[i] = L->data[i+1];
		}
		L->length--;
	}
	return true;
}

//判断当前结构体数组是否需要扩容 
bool isExCapciaty(SeqList * L,int length){
//	结构体数组的有效长度大于默认长度就扩容 
	if(L->length>MaxSize){
		return true; 
	}
	
	return false;
} 

//扩容操作
void ExCapacity(SeqList * L){
	//创建一个新的 DateType数组,是原来的1.5倍
	DateType newArray[MaxSize+MaxSize>>1]; 
	//将原来的数据进行拷贝
	for(int i = 0 ;i <L->length;i++){
		newArray[i]=L->data[i];
	} 
	//将结构体的原数组,指向新数组(我是学Java的这里至于怎么实现的语法忘记了)
	//	需要的小伙伴自己实现哦 
//	…… 
	
} 
int main(){
	int r[5] = {1,2,3,4,5};
	int i;

	SeqList  L;
	//初始化顺序表默认长度为0 
	InitList(&L);
	//创建线性表 
	CreateList(&L,r,5);
	foreach(&L); 
	//插入 在第三个位置插入88 期望结果:1,2,88,3,4,5 
	if(insert(&L,3,88)){
		printf("插入数据成功!\n"); 
	}; 
	//遍历 
	foreach(&L);
	printf("线性表当前长度为:%d\n",Length(&L));
	//在顺序表中查询值为11的元素 
	printf("%d\n",searchByValue(&L,11));
	
	//查找元素索引为2的值 
	indexOf(&L,2,&i);
	printf("索引为2的值为:%d\n",i);
	//删除元素的值 
	if(	deleteByValue(&L,88)){
		printf("删除成功!\n");
		foreach(&L); 
	}
	printf("%d",isEmpty(&L) ); 
}

记录一下自己的数据结构学习打卡,实现了顺序表的基本操作增删改查,由于在大一时第一次接触代码,不熟悉数据结构也学得马马虎虎,现在重新学习。加油!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以回答这个问题。顺序是一种线性数据结构,可以用数组来实现。基本操作包括插入、删除、查找、遍历等。以下是一个用C语言实现顺序的代码示例: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 // 定义顺序的最大长度 typedef struct { int data[MAXSIZE]; // 存储数据的数组 int length; // 当前顺序的长度 } SqList; // 初始化顺序 void InitList(SqList *L) { L->length = 0; } // 插入元素 int ListInsert(SqList *L, int pos, int elem) { if (pos < 1 || pos > L->length + 1 || L->length == MAXSIZE) { return 0; // 插入位置不合法或顺序已满,插入失败 } for (int i = L->length; i >= pos; i--) { L->data[i] = L->data[i-1]; // 将插入位置后的元素依次后移 } L->data[pos-1] = elem; // 插入新元素 L->length++; // 长度加1 return 1; // 插入成功 } // 删除元素 int ListDelete(SqList *L, int pos) { if (pos < 1 || pos > L->length) { return 0; // 删除位置不合法,删除失败 } for (int i = pos; i < L->length; i++) { L->data[i-1] = L->data[i]; // 将删除位置后的元素依次前移 } L->length--; // 长度减1 return 1; // 删除成功 } // 查找元素 int GetElem(SqList *L, int pos) { if (pos < 1 || pos > L->length) { return -1; // 查找位置不合法,返回-1 } return L->data[pos-1]; // 返回查找到的元素 } // 遍历顺序 void TraverseList(SqList *L) { for (int i = 0; i < L->length; i++) { printf("%d ", L->data[i]); } printf("\n"); } int main() { SqList L; InitList(&L); ListInsert(&L, 1, 1); ListInsert(&L, 2, 2); ListInsert(&L, 3, 3); TraverseList(&L); ListDelete(&L, 2); TraverseList(&L); printf("%d\n", GetElem(&L, 2)); return 0; } ``` 这个代码实现顺序的初始化、插入、删除、查找和遍历等基本操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明天码上有钱啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值