数据结构学习笔录——线性表的实现
2015-04-04 10:48
267 查看
线性表是一种最简单的线性结构,它是由同类数据元素组成的有序序列的集合。表中的元素个数称为表长,表中没有元素时称为空表,表的起始位置称为表头,表的结束位置称为表尾。线性表一般有两种方法存储,顺序存储和链式存储。
1、线性表的顺序存储实现
(1)数据结构的定义
里面包含一个存储数据的数组和一个指向数组最后一个元素的下标。
(2)线性表一般包含以下几个基本的操作函数接口
List* MakeEmpty(); --创建一个空表
int Find(int elem,List *list); --按值寻找elem的节点,并返回该节点下标
int FindKth(int k,List *list); --按序号查找第K(下标)个节点,并返回该节点的数据
void Delete(int i,List *list); --删除下标为i个元素
void Insert(int elem,int i,List *list); --在下标为的i的前面插入一个新元素
int Lenth(List *list); --计算表的长度
(3)具体实现方法
2、线性表的链式存储实现
(1)数据结构
List* Find(int elem,List *list); --按值寻找elem的节点,并返回指向该节点的指针
List* FindKth(int k,List *list); --按序号查找第K(下标)个节点,并返回指向该节点的指针
List* Delete(int i,List *list); --删除第i个元素,返回删除之后的链表头指针
List* Insert(int elem,int i,List *list); --在i-1前面插入一个新元素,返回插入之后的链表头指针
int Lenth(List *list); --计算表的长度
(3)具体实现
1、线性表的顺序存储实现
(1)数据结构的定义
typedef struct list{ int Data[MAXSIZE]; int last; }List;
里面包含一个存储数据的数组和一个指向数组最后一个元素的下标。
(2)线性表一般包含以下几个基本的操作函数接口
List* MakeEmpty(); --创建一个空表
int Find(int elem,List *list); --按值寻找elem的节点,并返回该节点下标
int FindKth(int k,List *list); --按序号查找第K(下标)个节点,并返回该节点的数据
void Delete(int i,List *list); --删除下标为i个元素
void Insert(int elem,int i,List *list); --在下标为的i的前面插入一个新元素
int Lenth(List *list); --计算表的长度
(3)具体实现方法
List* MakeEmpty() { List *list; list=(List*)malloc(sizeof(List)); list->last=-1; return list; } int Find(int elem,List *list) { int i=list->last; while(list!=NULL&&i!=-1) { if(list->Data[i]==elem) return i; i--; } return -1; } int FindKth(int k,List *list) { return list->Data[k]; } void Insert(int elem,int i,List *list) { if(Lenth(list)<MAXSIZE) { int j; for(j=list->last+1;j>i;j--) { list->Data[j]=list->Data[j-1]; } list->Data[i]=elem; list->last=list->last+1; } else { printf("\nthere is no enough space to insert"); } } void Delete(int i,List *list) { if(i>1&&i<=list->last+1) { int j; for(j=i;j<list->last;j++) list->Data[j]=list->Data[j+1]; list->last=list->last-1; } else { printf("no elem at %d\n",i); } } int Lenth(List *list) { return list->last+1; } //测试代码 int main() { List *list=MakeEmpty(); int i; for(i=0;i<10;i++) { list->Data[i]=i; list->last++; } int a; printf("input a num\n"); scanf("%d",&a); int ret=Find(a,list); if(ret>=0) { printf("%d has found,which is at %d\n",a,ret); printf("the %dth is %d\n",a,FindKth(ret,list)); } else { printf("%d isn't exsit\n",a); } printf("lenth=%d\n",Lenth(list)); printf("before insert:"); int j; for(j=0;j<list->last+1;j++) printf("%d ",list->Data[j]); Insert(520,5,list); printf("\nafter insert:"); int k; for(k=0;k<list->last+1;k++) printf("%d ",list->Data[k]); printf("\nlenth=%d\n",Lenth(list)); Delete(5,list); printf("after delete:"); for(k=0;k<list->last+1;k++) printf("%d ",list->Data[k]); printf("\nlenth=%d\n",Lenth(list)); return 0; }
2、线性表的链式存储实现
(1)数据结构
typedef struct Node{ int data; struct Node* next; }List;(2)基本操作函数接口
List* Find(int elem,List *list); --按值寻找elem的节点,并返回指向该节点的指针
List* FindKth(int k,List *list); --按序号查找第K(下标)个节点,并返回指向该节点的指针
List* Delete(int i,List *list); --删除第i个元素,返回删除之后的链表头指针
List* Insert(int elem,int i,List *list); --在i-1前面插入一个新元素,返回插入之后的链表头指针
int Lenth(List *list); --计算表的长度
(3)具体实现
List* Find(int elem,List *list) { List *p=list; while(p) { if(p->data==elem) return p; p=p->next; } return NULL; } List* FindKth(int k,List *list) { int i; List *p=list; int len=Lenth(list); for(i=0;i<len;i++) { if(i==k) return p; p=p->next; } return NULL; } List* Insert(int elem,int i,List *list) { int k=0; List *p=list; List *q; if(i==0)//表示在表头插入新节点 { q=(List*)malloc(sizeof(List)); q->data=elem; q->next=list; return q; } p=FindKth(i-1,list); if(p!=NULL) { //指针P已经移到i-1的位置 q=(List*)malloc(sizeof(List)); q->data=elem; q->next=p->next; p->next=q; return list; } else { printf("\n参数输入有误,无法完成插入\n"); return NULL; } } List* Delete(int i,List *list) { List *p=list; List *q; if(i==0) { list=p->next; free(p); return list; } p=FindKth(i-1,list); if(p==NULL) { printf("\n没有第%d个节点\n",i-1); return list; } else if(p->next==NULL) { printf("\n没有第%d个节点\n",i); return list; } else { q=p->next; p->next=q->next; free(q); return list; } } int Lenth(List *list) { int i=0; List *p=list; while(p) { p=p->next; i++; } return i; } int main() { List *list; int i; list=Insert(0,0,NULL); for(i=1;i<11;i++) list=Insert(i,0,list); printf("elem in list is:\n"); printf("lenth of list is %d\n",Lenth(list)); int len; List *p=list; len=Lenth(list); for(i=0;i<len;i++) { printf("%d ",p->data); p=p->next; } p=Insert(1120,4,list); if(p!=NULL) { len=Lenth(p); printf("\n"); for(i=0;i<len;i++) { printf("%d ",p->data); p=p->next; } printf("\nthe lenth of list is %d",len); } p=Delete(12,list); if(p!=NULL) { len=Lenth(p); printf("\n"); for(i=0;i<len;i++) { printf("%d ",p->data); p=p->next; } printf("\nthe lenth of list is %d",len); } p=Find(11,list); if(p) printf("\nfind success\n"); else printf("\nthe elem you find is not exsit\n"); return 0; }
相关文章推荐
- 数据结构学习----线性表的链式表示之循环双链表(Java实现)
- 数据结构学习2--线性表的设计与实现(二)
- 数据结构学习笔录---队列的实现
- 数据结构学习笔录--堆的实现
- 数据结构学习笔记-线性表顺序存储(C语言实现)
- 严蔚敏版数据结构学习笔记(1):线性表的顺序表示和实现
- 数据结构学习----线性表的链式表示之升序排序的单链表(Java实现)
- 数据结构学习2--线性表的设计与实现(一)
- 数据结构学习-线性表-顺序表的代码实现
- 数据结构学习之线性表的顺序实现(python 实现)
- 严蔚敏版数据结构学习笔记(2):线性表的链式表示和实现
- 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现
- 数据结构学习笔录--堆栈的实现
- 数据结构学习----线性表的链式表示之循环单链表(Java实现)
- 数据结构学习----线性表的链式表示(Java实现)
- python数据结构学习之实现线性表的顺序
- 数据结构学习笔记 --- 线性表 (单链表)
- 高级数据结构设计--并查集及实现学习笔记(有趣篇)
- 数据结构学习笔记之链表分析与实现(三)
- 数据结构学习笔记 --- 线性表 (应用举例)