数据结构学习笔录——线性表的实现

来源:互联网 发布:蚁群算法原理应用论文 编辑:程序博客网 时间: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;}





0 0
原创粉丝点击