数据结构之顺序存储

  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. #define OK 1
  4. #define OVERFLOW 0
  5. #define LIST_INIT_SIZE 100 //可以存放的数据个数
  6. #define LISTINCREMENT 10
  7. typedef struct {
  8. char *elem; //这个char 可以替换成其它数据类型
  9. int length; //当前这个顺序表的长度
  10. int listsize; //线性表的长度
  11. }SqList;
  12. 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;
    }

  13. int main(void)
    {
    int y;
    SqList L;
    y = InitList(L);
    printf("y=%d",y);
    return 0;
    }

                                               上图是线性表分配成功的标志

//个人看法:这种线性表的初始化就是按照结构题的知识找到elem,以及指针将数据放入一段连续的elem为首地址的内存空间中

  1. 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;
}

 

 

  1.                      上图是将元素‘a'插入成功示意图
  2. //原理就是将你想要插入的元素对应位置的的地址保存在指针变量中q中;将q后元素全部往后移动一位,使用的是*(p+1) = *p这句话的意思是将p的地址赋值给p+1这样就可以实现将q后面的数据往后移动一位,最后因为插入了一个数据,所以要将当前顺序表的长度+1;
  3. 未完请待续…………

 

posted @ 2020-09-20 15:55  xxf2  阅读(221)  评论(0编辑  收藏  举报