数据结构学习笔录——线性表的实现
来源:互联网 发布:蚁群算法原理应用论文 编辑:程序博客网 时间:2024/05/05 16:16
线性表是一种最简单的线性结构,它是由同类数据元素组成的有序序列的集合。表中的元素个数称为表长,表中没有元素时称为空表,表的起始位置称为表头,表的结束位置称为表尾。线性表一般有两种方法存储,顺序存储和链式存储。
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");elseprintf("\nthe elem you find is not exsit\n");return 0;}
- 数据结构学习笔录——线性表的实现
- 数据结构学习笔录---队列的实现
- 数据结构学习笔录--堆栈的实现
- 数据结构学习笔录--堆的实现
- 数据结构——线性表的实现
- 数据结构——线性表的学习
- 数据结构学习之线性表的顺序实现(python 实现)
- 数据结构学习笔录--二叉树的遍历
- 【三十一】 数据结构——线性表的存储的实现
- 数据结构——线性表的C++实现
- 数据结构第一章——线性表的实现
- 数据结构实战——线性表的单链表实现
- 数据结构——线性表以及各功能的实现
- 数据结构复习——线性表的顺序存储实现
- Java数据结构——线性表的顺序存储实现
- 数据结构——栈的线性表实现
- 数据结构——线性表的实现(增删部分)
- 数据结构线性表—静态顺序表的实现
- iOS 预留
- opencv中图像的通道、深度的解释
- Linux 开发环境搭建与使用——Linux 常用编辑器之vim
- NGUI学习笔记
- Reverse Linked List II--LeetCode
- 数据结构学习笔录——线性表的实现
- POJ3294---Life Forms(后缀数组,二分+给后缀分组)
- python实现清华大学联网助手(二)——正则表达式re/网页跳转/cookiejar
- js中获取键盘事件
- CUDA编程指南(第五章)
- python字符集编码深入理解
- 第22课时,实践,画流程图
- java学习笔记(七)
- 12. PHP String 字符串(2)