首先来一点点的概念
一,一两个重要的概念
关于概念的学习提示:看看就好,后面你熟练了再返回来看,或者当你学习了java,c++的STL之后回来看这一章的时候,你会发现原来所有的一切容器,早在一百多年前,计算机专家就已经有了描述,原来一切封装都有一定的原则,原来学习了这个课程之后,一切的容器都有一模一样的规则!!!还是老话我很排斥概念,不过有的概念是必须知道的,有点印象之后,后面学东西会有突然的顿悟,好了,开始吧,废话很多了。
概念1
线性表的特点:(1)存在唯一的一个被称为“第一个”的数据元素
(2)存在唯一的一个被称为"最后一个"的数据元素
(3)除第一个之外,集合中的每个元素只有一个前驱(前驱:就好像排队一样,你个子比较矮,你只看到前面哪个人排在你前面,再前面的被那个高的挡住了)
(4)除了最后一个之外,集合中的每个元素均只有一个后继(后继:一样还是因为你个子矮,你只看到你后面排了谁,再后面的被挡住了)
二,线性表的顺序存储结构
#define MAXSIZE 50
typedef struct
{
int data[MAXSIZE];
int length;
}List;
前面讲了一堆都不到肉,到底什么是线性表?讲得简单一点就是一对简单数据类型的组合,那什么是顺序存储结构?书上说是存在计算机存储器的一块连续的存储空间,如果还没有入门计算机组成原理的,可能对这句话晕忽忽的,其实用一个简单点的表示方法就是数组啦,一个接着一个像排队一样,有人来插队了,怎么办?大家都往后退一步,有人离开了,怎么办?大家都往前挪一步,这就是顺序存储结构的特点了。
下面我们来定义一个顺序存储结构的存储类型,脑子里一定要有排队的概念
说明:上面的存储结构中的data就是这个队了,这个队只能排50个人,length就是现在已经有多少个人在排队
关于这个数据结构我们要提供几个全局的方法,首先,安排所有人要买东西先排队,所以我们要先腾出一块地方给人排队(初始化),队里一个人离开了,就删除它(删除),队里来一个人靠关系来插队了就加入它(插入),没东西卖了,就解散这个队伍(销毁)。
好了下面动手这个过程
初始化:
void InitList(List *&list)
{
list =(List *)malloc(sizeof(List));
memset(list->data,0,sizeof(list->data));
list->length=0;
}
插入:
void ListInsert(List *list,int index,int value)
{
int *ptrBegin= list->data;
int *ptrEnd = ptrBegin+MAXSIZE-1;
int *ptrIndex=ptrBegin+index;
if(ptrEnd>=ptrIndex&&ptrIndex>=ptrBegin)
{
while(ptrEnd>ptrIndex)
{
*ptrEnd=*(ptrEnd-1);
ptrEnd--;
}
*ptrIndex=value;
list->length++;
}
}
删除:
int ListDelete(List *list,int index)
{
int *ptrBegin= list->data;
int *ptrIndex=list->data+index;
int *ptrEnd=list->data+MAXSIZE-1;
int e = list->data[index];
if(ptrEnd>=ptrIndex&&ptrIndex>=ptrBegin)
{
while(ptrIndex<ptrEnd)
{
*ptrIndex=*(ptrIndex+1);
ptrIndex++;
}
list->length--;
return e;
}
return 0;
}
销毁:
void ListDesotry(List * &list)
{
free(list);
}
为了方便大家copy玩一下,贴出整体的代码,不过本人的代码也没有高效率,主要为了清晰易懂,大家研究研究,有bug多提提啦!
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAXSIZE 50
typedef struct
{
int data[MAXSIZE];
int length;
}List;
void InitList(List *&list)
{
list =(List *)malloc(sizeof(List));
memset(list->data,0,sizeof(list->data));
list->length=0;
}
void ListInsert(List *list,int index,int value)
{
int *ptrBegin= list->data;
int *ptrEnd = ptrBegin+MAXSIZE-1;
int *ptrIndex=ptrBegin+index;
if(ptrEnd>=ptrIndex&&ptrIndex>=ptrBegin)
{
while(ptrEnd>ptrIndex)
{
*ptrEnd=*(ptrEnd-1);
ptrEnd--;
}
*ptrIndex=value;
list->length++;
}
}
int ListDelete(List *list,int index)
{
int *ptrBegin= list->data;
int *ptrIndex=list->data+index;
int *ptrEnd=list->data+MAXSIZE-1;
int e = list->data[index];
if(ptrEnd>=ptrIndex&&ptrIndex>=ptrBegin)
{
while(ptrEnd>ptrIndex)
{
*ptrIndex=*(ptrIndex+1);
ptrIndex++;
}
list->length--;
return e;
}
return 0;
}
void ListDesotry(List * &list)
{
free(list);
}
int main()
{
List *list;
InitList(list);
for(int i=0;i<4;i++)
{
ListInsert(list,i,i);
}
ListDelete(list,3);
for(int i=0;i<list->length;i++)
{
printf("%d\t",list->data[i]);
}
ListDesotry(list);
printf("\n");
return 0;
}