数据结构之顺序存储

xxf2 2020-09-20 15:55:00
原文地址:https://www.cnblogs.com/zqit/p/13697413.html
  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. 未完请待续…………

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。