数据结构--线性表之顺序表(C语言)

线性表的概念

线性表在逻辑上是线性的结构,也就是说,是连续的一条直线,但在物理结构上不一定是连续的,线性表在物理上存储时,通常以数组和链式结构形式存储。

常见的线性表为:顺序表,链表,栈,队列,字符串...

一、顺序表的实现

1.顺序表的概念和结构

顺序表是使用一段物理地址连续的存储单元依次存取数据元素的线性结构,一般情况下采用数组存储,在数组上完成对数据的增删查改。

顺序表一般可分为:

(1)静态顺序表:使用定长数组存储;

(2)动态顺序表:使用动态开辟数组存储;

建立Seqlist1.h头文件:

#pragma once//防止被重复包含
#include<stdio.h>
#include<string.h>
#define N 10
typedef int SQDataType;
typedef struct Seqlist1 Sl;
//宏定义,增强程序的可维护性


//静态顺序表不够灵活,空间运用效率低

struct Seqlist1//定义结构体
{
	SQDataType a[N];//定义数组大小
	int size;
};


//增删查改等接口函数
void Seqlist(Sl* psl);//初始化  指向结构体的指针
void  SeqlistPushBack(Sl* psl, SQDataType x);//尾插
void SeqlistPushFront(Sl* psl, SQDataType x);//头插
void SeqlistPopBack(Sl* psl);//头删
void SeqlistPopFront(Sl* psl);//尾删

建立Seqlist1.c源文件:

#include"Seqlist1.h"
//增删查改接口函数
void SeqlistInit( struct Seqlist1*  psl)
{
	memset(psl->a, 0, sizeof(SQDataType)*N);//数组中的内容按字节初始化
	psl->size = 0;
}
void  SeqlistPushBack(Sl* psl, SQDataType x)//尾插
{
	if ( psl->size >= N)
	{
		printf("Seqlist is full!\n");
		return ;
	}
	psl->a[psl->size] = x;
	psl->size++;

}
void SeqlistPushFront(Sl* psl, SQDataType x);//头插
void SeqlistPopBack(Sl* psl);//头删
void SeqlistPopFront(Sl* psl);//尾删

建立Text.c

#include"Seqlist1.h"

void TestSeqlist1()
{
	struct Seqlist1 sl;
	SeqlistInit(&sl);//调接口进行初始化  形参的地址传给实参
	SeqlistPushBack(&sl,1);
	SeqlistPushBack(&sl, 2);
	SeqlistPushBack(&sl, 3);
	SeqlistPushBack(&sl, 4);
	SeqlistPushBack(&sl, 5);
	SeqlistPushBack(&sl, 6);
	SeqlistPushBack(&sl, 7);
	SeqlistPushBack(&sl, 8);
	SeqlistPushBack(&sl, 9);
	SeqlistPushBack(&sl, 10);
	SeqlistPushBack(&sl, 11);
}

int main()
{
	TestSeqlist1();
	return 0;
}

由此可见静态的顺序表空间利用效率较低,不够灵活

对于动态顺序表而言:

Seqlist.h

#pragma once//防止被重复包含
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define N 10
typedef int SQDataType;
typedef struct Seqlist1 Sl;
//宏定义,增强程序的可维护性


//静态顺序表不够灵活,空间运用效率低

struct Seqlist1//定义结构体
{
	SQDataType *a;
	int size;//有效数据个数
	int capacity;//容量可变
};


//增删查改等接口函数
void Seqlist(Sl* psl);//初始化  指向结构体的指针
void SeqlistPrintf(Sl* psl);
void  SeqlistPushBack(Sl* psl, SQDataType x);//尾插
void SeqlistPushFront(Sl* psl, SQDataType x);//头插
void SeqlistPopBack(Sl* psl);//头删
void SeqlistPopFront(Sl* psl);//尾删

Seqlist1.c

#include"Seqlist1.h"

void SeqlistInit(Sl*  psl )
{
	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;
}

//头插尾插,头删,尾删
void SeqlistPushBack(Sl* psl, SQDataType x)
{
	//判断是否满了,满了就要扩容
	if (psl->size =psl-> capacity)
	{
		int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		SQDataType* tmp = realloc(psl->a, newcapacity * 2 * sizeof(SQDataType));
		if (tmp = NULL)
		{
			printf("realloc fail!\n");//扩容失败
			return(-1);//结束程序
		}

		else
		{
			psl->a = tmp;
			psl->capacity *= newcapacity;
		}
	}

	psl->a[psl->size] = x;
	psl->size++;
}

//头插
void SeqlistPushFront(Sl* psl, SQDataType x)
{
	//将数往后挪
	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->a[end + 1] = psl->a[end];
		--end;
	}
	psl->a[0] = x;
	psl->size++;
}

void SeqlistPrintf(Sl* psl)
{
	for (int i = 0; i < psl->size; ++i)
	{
		printf("%d", psl->a[i]);
	}
	 printf(" \n");
}

Text.c

#include"Seqlist1.h"

void TestSeqlist1()
{
	struct Seqlist1 sl;
	SeqlistInit(&sl);//调接口进行初始化  形参的地址传给实参
	SeqlistPushFront(&sl,1);
	SeqlistPushFront(&sl, 2);
	SeqlistPushFront(&sl, 3);
	SeqlistPushFront(&sl, 4);
	SeqlistPushFront(&sl, 5);
	SeqlistPrintf(&sl);
}

int main()
{
	TestSeqlist1();
	return 0;
}

这块好难,我煎熬的听了 一节课之后,就打算看看代码就完事,春招还有希望吗????感觉自己考研不太可能上岸,哎。其实心里很崩溃,就好好刷题练吧,我相信会好的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值