从很早以前就知道数据结构很重要,一直想好好学一下。可每次才将线性结构看完,就没劲了!深感惭愧。
首先介绍下数组:
数组有两种:一种是静态数组,一种是动态数组。
静态数组的长度是固定的,通常在编译阶段就能够确定数组的大小。而动态数组的大小不固定,在程序运行当中由程序员指定。
比如: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;
}