数据结构之顺序存储
- # include <stdio.h>
- # include <stdlib.h>
- #define OK 1
- #define OVERFLOW 0
- #define LIST_INIT_SIZE 100 //可以存放的数据个数
- #define LISTINCREMENT 10
- typedef struct {
- char *elem; //这个char 可以替换成其它数据类型
- int length; //当前这个顺序表的长度
- int listsize; //线性表的长度
- }SqList;
-
int InitList(SqList &L)
{
L.elem = (char *)malloc(LIST_INIT_SIZE*sizeof(char));//动态分配了可以存放100个元素的内存空间,并将首地址赋值给指针变量elem;
if(!L.elem)//表示的是内存分配失败
exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
} -
int main(void)
{
int y;
SqList L;
y = InitList(L);
printf("y=%d",y);
return 0;
}
上图是线性表分配成功的标志
//个人看法:这种线性表的初始化就是按照结构题的知识找到elem,以及指针将数据放入一段连续的elem为首地址的内存空间中;
- 2 元素插入:
int ListInsert(SqList &L,int i,char e)
{
if (i<1||i>L.length)
return -1;
char * newbase;
char *p ,*q;
if(L.length >= L.listsize)//就是比较的是顺序表中存储的数是否达到这个线性表的最大值
{
newbase = (char *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(char));//相当于又在原有100个存储单位上有添加了10个存储单位的大小
if(!newbase)
exit(OVERFLOW);
L.elem = newbase;
L.listsize+=LISTINCREMENT;
}
q = &(L.elem[i-1]);//q为第i个元素
for (p = &(L.elem[L.length-1]);p>=q;p--)
*(p+1) = *p;
*q = e;
L.length ++;
return OK;
}
- 上图是将元素‘a'插入成功示意图
- //原理就是将你想要插入的元素对应位置的的地址保存在指针变量中q中;将q后元素全部往后移动一位,使用的是*(p+1) = *p这句话的意思是将p的地址赋值给p+1这样就可以实现将q后面的数据往后移动一位,最后因为插入了一个数据,所以要将当前顺序表的长度+1;
- 未完请待续…………