线性结构之顺序表------C实现

  从很早以前就知道数据结构很重要,一直想好好学一下。可每次才将线性结构看完,就没劲了!深感惭愧。

首先介绍下数组:

数组有两种:一种是静态数组,一种是动态数组。

静态数组的长度是固定的,通常在编译阶段就能够确定数组的大小。而动态数组的大小不固定,在程序运行当中由程序员指定。

比如:int a[40];就是一个静态数组;动态数组在C语言中常采用malloc()、realloc()等函数分配内存。

下面的代码采用C实现了一个动态数组的数据结构。

#include<stdio.h>
#include<stdbool.h>//c99标准,包含了bool类型 编译时加上-std=c99(如果在linux下编译)
#include<stdlib.h>

typedef int ElementType;

#define LIST_SIZE 1024//宏定义表的初始化大小
#define LIST_INCREASE 10
#define OVERFLOW -1
#define OK 1

//该结构保存了顺序表的基本信息
typedef struct Sequence
{
	ElementType *base;//基址
	int length;//有效元素的个数
	int listsize;//顺序表容量
} SeqList;

int InitSeqList(SeqList *Pseq)
{
	Pseq->base = (ElementType *)malloc(sizeof(ElementType) * LIST_SIZE);//使用了预定义的表的大小
	if (Pseq->base == NULL)
		exit(OVERFLOW);
	Pseq->length = 0;
	Pseq->listsize = LIST_SIZE;
	return OK;
}

//创建线性表
void CreateSeqList(SeqList *Pseq, int n)
{
	for (int i=0; i<n; i++)
	{
		printf("Please input %d element:\n", i);
		scanf("%d", &Pseq->base[i]);
		Pseq->length ++;
	}
}

void DeleteSeqList(SeqList *Pseq)
{
	free(Pseq->base);
	Pseq->listsize = 0;
	Pseq->length = 0;
}

bool LocateElement(SeqList *Pseq, ElementType element)
{
	for (int i=0; i<Pseq->length; i++)
	{
		if (Pseq->base[i] == element)
			return true;
	}
	return false;
}

//删除表中位置pos处的元素,并将其元素返回e中
void DeleteElement(SeqList *Pseq, ElementType *e, int pos)
{
	if (pos<1 || pos>Pseq->length+1)
	{
		printf("position is error!\n");
		exit(-1);
	}
	*e = Pseq->base[pos-1];//将待删除的元素保存
	for (int i=pos;  i<Pseq->length; i++)
	{
		Pseq->base[i-1] = Pseq->base[i];//依次将pos处的元素向后移动
	}
	--Pseq->length;
}

//在位置pos处插入元素e:注意:插入后的元素的位置就是pos
void InsertElement(SeqList *Pseq, ElementType e, int pos)
{
	ElementType *newBase;
	if (pos<1 || pos>Pseq->length+1)//插入位置有误
		exit(-1);

	if(Pseq->length == Pseq->listsize)//说明空间已满,重新分配空间
	{
		newBase = (ElementType *)realloc(Pseq->base, sizeof(ElementType) * (LIST_SIZE + LIST_INCREASE));
		if(newBase == NULL)
			exit(-1);
		Pseq->base = newBase;
		Pseq->listsize = LIST_SIZE + LIST_INCREASE;
	}

	for (int i=Pseq->length-1; i>=pos-1; i--)
		Pseq->base[i+1] = Pseq->base[i];//将当前的元素,向后移动1位
	Pseq->base[pos-1] = e;//将元素插入
	++Pseq->length;//更新当前元素个数
}

void TravserSeqList(SeqList *Pseq)
{
	for (int i=0; i<Pseq->length; i++)
	{
		printf("%d ", Pseq->base[i]);
	}
	printf("\n");
}
int main()
{
	SeqList seq;
	ElementType element;//保存待查找的元素
	ElementType element1;//保存待删除的元素
	int pos;//保存位置,待删除元素的位置
	int pos1;//待插入元素的位置
	ElementType element2;//待插入的元素
	int N;//保存初始化的元素个数

	//SeqList *Pseq = InitSeqList(&seq);//为何初始化的返回值是int,内存的分配,变量的生存周期?
	InitSeqList(&seq);//初始化线性表
	printf("Please input the number of elements:\n");
	scanf("%d", &N);
	CreateSeqList(&seq, N);
	TravserSeqList(&seq);
	printf("Please input look for element :\n");
	scanf("%d", &element);
	if (LocateElement(&seq, element))
		printf("%d exited!\n", element);
	else
		printf("not exited\n");

	printf("Please input delete pos of element \n");
	scanf("%d", &pos);
	DeleteElement(&seq, &element1, pos);
	printf("delete element is %d\n", element1);
	TravserSeqList(&seq);

	printf("Please input insert element and position:\n");
	scanf("%d%d", &element2,&pos1);
	InsertElement(&seq,element2, pos1);
	TravserSeqList(&seq);

	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值