数据结构-线性表(学习笔记)
2015-08-11 19:45
691 查看
定义:
1.线性表(List)是零个或多个数据元素的集合
2.线性表中的数据元素之间是有顺序的
3.线性表中的数据元素个数是有限的
4.线性表中的数据元素的类型必须相同
线性表是具有相同类型的 n( ≥ 0)个数据元素的有限序列 a1, a2, …, an ,ai是表项,n 是表长度。
性质:
1.a0为线性表的第一个元素,只有一个后继
2.an为线性表的最后一个元素,只有一个前驱
3. 除a0和an外的其它元素ai,既有前驱,又有后继
4.线性表能够逐项访问和顺序存取
线性表的操作:
1.创建并且返回一个空的线性表
2.销毁一个线性表
3.清空一个线性表
4.回一个线性表中的所有元素个数
5.向一个线性表的pos位置处插入新元素node
6.获取一个线性表的pos位置处的元素
7.删除一个线性表的pos位置处的元素
创建头文件:
创建c文件:
线性表优点:
1.无需为线性表中的逻辑关系增加额外的空间
2.可以快速的获取表中合法位置的元素
线性表缺点:
1.插入和删除操作需要移动大量元素
2.当线性表长度变化较大时难以确定存储空间的容量
1.线性表(List)是零个或多个数据元素的集合
2.线性表中的数据元素之间是有顺序的
3.线性表中的数据元素个数是有限的
4.线性表中的数据元素的类型必须相同
线性表是具有相同类型的 n( ≥ 0)个数据元素的有限序列 a1, a2, …, an ,ai是表项,n 是表长度。
性质:
1.a0为线性表的第一个元素,只有一个后继
2.an为线性表的最后一个元素,只有一个前驱
3. 除a0和an外的其它元素ai,既有前驱,又有后继
4.线性表能够逐项访问和顺序存取
线性表的操作:
1.创建并且返回一个空的线性表
2.销毁一个线性表
3.清空一个线性表
4.回一个线性表中的所有元素个数
5.向一个线性表的pos位置处插入新元素node
6.获取一个线性表的pos位置处的元素
7.删除一个线性表的pos位置处的元素
创建头文件:
#ifndef _SEQLIST_H_ #define _SEQLIST_H_ typedef void SeqList; typedef void SeqListNode; SeqList* SeqList_Create(int capacity); void SeqList_Destroy(SeqList* list); void SeqList_Clear(SeqList* list); int SeqList_Length(SeqList* list); int SeqList_Capacity(SeqList* list); int SeqList_Insert(SeqList* list, SeqListNode* node, int pos); SeqListNode* SeqList_Get(SeqList* list, int pos); SeqListNode* SeqList_Delete(SeqList* list, int pos); #endif
创建c文件:
#include <stdio.h> #include <malloc.h> #include "SeqList.h" typedef unsigned int TSeqListNode;//正好可以保存一个地址值 typedef struct _tag_SeqList { int capacity;//容量 int length;//线性表的长度 TSeqListNode* node; } TSeqList; SeqList* SeqList_Create(int capacity) // O(1) { TSeqList* ret = NULL; if( capacity >= 0 ) { ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);//分配内存 } if( ret != NULL ) { ret->capacity = capacity; ret->length = 0; ret->node = (TSeqListNode*)(ret + 1); } return ret; } void SeqList_Destroy(SeqList* list) // O(1) { free(list); } void SeqList_Clear(SeqList* list) // O(1) { TSeqList* sList = (TSeqList*)list; if( sList != NULL ) { sList->length = 0; } } int SeqList_Length(SeqList* list) // O(1) { TSeqList* sList = (TSeqList*)list; int ret = -1; if( sList != NULL ) { ret = sList->length; } return ret; } int SeqList_Capacity(SeqList* list) // O(1) { TSeqList* sList = (TSeqList*)list; int ret = -1; if( sList != NULL ) { ret = sList->capacity; } return ret; } int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) // O(n) { TSeqList* sList = (TSeqList*)list; int ret = (sList != NULL);//判断线性表是否合法 int i = 0; //判断是否超过线性表最大容量 ret = ret && (sList->length + 1 <= sList->capacity); ret = ret && (0 <= pos); if( ret ) { if( pos >= sList->length ) { pos = sList->length; } //pos后的元素向后移动一位 for(i=sList->length; i>pos; i--) { sList->node[i] = sList->node[i-1]; } //将node赋值到pos上 sList->node[i] = (TSeqListNode)node; //将线性表长度加1 sList->length++; } return ret; } SeqListNode* SeqList_Get(SeqList* list, int pos) // O(1) { TSeqList* sList = (TSeqList*)list; SeqListNode* ret = NULL; //判断线性表是否合法 pos是否合法 if( (sList != NULL) && (0 <= pos) && (pos < sList->length) ) { ret = (SeqListNode*)(sList->node[pos]); } return ret; } SeqListNode* SeqList_Delete(SeqList* list, int pos) // O(n) { TSeqList* sList = (TSeqList*)list; SeqListNode* ret = SeqList_Get(list, pos); int i = 0; if( ret != NULL ) { for(i=pos+1; i<sList->length; i++) { sList->node[i-1] = sList->node[i]; } sList->length--; } return ret; }创建测试文件:
#include <stdio.h> #include <stdlib.h> #include "SeqList.h" /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { SeqList* list = SeqList_Create(5); int i = 0; int j = 1; int k = 2; int x = 3; int y = 4; int z = 5; int index = 0; SeqList_Insert(list, &i, 0); SeqList_Insert(list, &j, 0); SeqList_Insert(list, &k, 0); SeqList_Insert(list, &x, 0); SeqList_Insert(list, &y, 0); SeqList_Insert(list, &z, 0); for(index=0; index<SeqList_Length(list); index++) { int* p = (int*)SeqList_Get(list, index); printf("%d\n", *p); } printf("\n"); while( SeqList_Length(list) > 0 ) { int* p = (int*)SeqList_Delete(list, 0); printf("%d\n", *p); } SeqList_Destroy(list); return 0; }运行结果:
线性表优点:
1.无需为线性表中的逻辑关系增加额外的空间
2.可以快速的获取表中合法位置的元素
线性表缺点:
1.插入和删除操作需要移动大量元素
2.当线性表长度变化较大时难以确定存储空间的容量
相关文章推荐
- 数据结构_堆排序介绍
- 数据结构实验:哈希表
- NOIP2009 提高组 最优贸易 解题报告
- 数据结构_线段树_例题_ I Hate It(HDU 1754)
- C源码@数据结构与算法->栈Stack
- cocos2d-x 中的数据结构集合(容器)(CCArray,Map,Vector)使用笔记
- 初学数据结构之排序
- 数据结构之堆栈计算器
- C++类实现hash表的抽象数据结构(链式解决冲突)
- 数据结构(29)图的遍历
- 数据结构(28)图的实现
- 数据结构(27)二叉树的操作
- 数据结构(26)二叉树
- 数据结构(25)树
- 数据结构(24)队列--两个栈实现
- 数据结构(23)队列--单链表实现
- 数据结构(22)循环队列--线性表实现
- 数据结构(21)队列--线性表实现
- 数据结构(20)栈--单链表实现
- 数据结构(19)栈的线性实现