您的位置:首页 > 理论基础 > 数据结构算法

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

2015-04-04 10:48 267 查看
线性表是一种最简单的线性结构,它是由同类数据元素组成的有序序列的集合。表中的元素个数称为表长,表中没有元素时称为空表,表的起始位置称为表头,表的结束位置称为表尾。线性表一般有两种方法存储,顺序存储和链式存储。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: