线性表的定义:
“线性表”(Linear List)是有同一类是类型的数据元素构成的有序的线性结构。
线性表的顺序存储实现:
线性表的顺序存储是指在内存中地址连续的一块空间顺序存放线性表的各元素。(萌新怒插:这不就是数组嘛???需要说的那么麻烦么???哦。)
一维数组在内存中占用的空间就是一组连续的存储区域,因此,用数组来表示存储的数据区域是再合适不过的。
为了体现
数据组织的整体性(萌新怒插:说仅仅为了这个需要搞那么麻烦,其实需要吧。?)
定义:
typedef struct{
ElementType Date[MAXSIZE];//说一下这里两个,ElementType 和 MAXSIZE 其实就是 int 的另外一种表现,当然前面已经typedef过了,(怕有些初学者看到不懂可以私信窝,或者问学长?
int Last;
}List;
这样可以利用List定义的线性表L或者线性表的指针Ptrl;
初始化:
List *MakeEmpty()
{
List *Ptrl;
Ptrl = (List *) malloc(sizeof(List));
Ptrl->Last=-1;//表示表中没有数据元素;
return Ptrl;
}
查找:
int Find(Element X,List *Ptrl)
{
int i=0;
while(i<=Ptrl->Last && Ptrl->Date[i]!=X)
i++;
if(i>Ptrl->Last)
return -1; //表示没找到;
return i; //返回存储位置;
}
插入删除:
萌新怒插:
插入操作,删除操作显然就是和数组操作原理还是一样。
插入注意:
①:表满;②:插入位置的合法性(首先当然他给了我一个指定位置去插);③:插完记得移动数据;
删除注意:
①:插入位置的合法性(首先当然他给了我一个指定位置去插);②:表空;
代码不写了。。。。有时间补。。。
线性表的链式存储实现:
(萌新怒插:其实就是链表嘛)
定义:
为了访问链表,必须找到链表的第一个数据单元,因此实际应用中常用一个称为“头结点”(Header)的指针指向链表的第一个单元,并用它表示一个具体的链表。
typedef struct Node{
ElementType Date;
struct Node *Next;
}List;
List *Ptrl;
求表长:
int Length(List *Ptrl)
{
List *P=Ptrl;
int len=0;
while(p)
{
p=p->Next;
len++; //把所有非空的结点都++;
}
return len;
}
按序号查找元素:
其实和表长操作差不多;
按键值查找 / 删除:
查找:
遍历整个链表,然后找到就返回咯;
删除:
遍历整个链表,然后找到,先把链表把这个目标的前一个结点和后一个结点连好,然后删除结点和释放空间;
给出删除代码:
List *Delete(int i,List *Ptrl)
{
List *p,*s;
if(i==1) //如果是第一个结点
{
s=Ptrl; //先用s存一下
Ptrl=Ptrl->Next; //先让Ptrl的下一个作为头节点;
free(s); //删除结点,并释放空间;
return Ptrl;
}
p=FindKth(i-1,Ptrl); //查找第i-1个结点;
if(p==NULL||p->Next==NULL)
{
printf("不存在\n");
return NULL;
}
s=p->Next; //存起来
p->Next=s->Next; //接一接
free(s); //删除并释放内存
return Ptrl; //返回头结点
}
插入:
和删除操作类似,只是在i-1位置,新建一个结点,然后这个结点的前面和i-1相接,然后这个结点的下面和原来的第i个结点相接就好了;