线性结构之顺序表------C实现
2016-11-10 13:35
375 查看
从很早以前就知道数据结构很重要,一直想好好学一下。可每次才将线性结构看完,就没劲了!深感惭愧。
首先介绍下数组:
数组有两种:一种是静态数组,一种是动态数组。
静态数组的长度是固定的,通常在编译阶段就能够确定数组的大小。而动态数组的大小不固定,在程序运行当中由程序员指定。
比如:int a[40];就是一个静态数组;动态数组在C语言中常采用malloc()、realloc()等函数分配内存。
下面的代码采用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; }
相关文章推荐
- 数据结构之:线性表的顺序表示和实现
- 线性表的存储结构---顺序表的实现
- 线性结构的顺序存储的实现
- 数据结构二:线性表的顺序结构实现
- 数据结构教程 第六课 线性表的顺序表示和实现
- 线性结构的顺序存储和链式存储的实现代码(二)
- 数据结构之线性表的顺序表示和实现
- 线性表之顺序表的结构与实现
- 线性表——顺序结构(c语言实现)
- 线性表的顺序表示和实现 - 数据结构
- 线性结构的顺序表实现 Java版
- 线性表——顺序结构(c语言实现)
- c++实现线性表的顺序结构
- 顺序结构线性表的实现
- 线性表顺序结构的实现
- Java 实现顺序结构线性列表
- java实现顺序结构线性列表的函数代码
- 数据结构实现顺序线性表的一些小应用
- [数据结构一]线性表:顺序实现
- 数据结构1:线性表的顺序表示和实现