数据结构——顺序表

顺序表的特征:

   1由唯一的表名标识;

   2占据一块连续的存储空间;

   3数据顺序存放,元素之间有先后关系;

 

定义动态的顺序表:

#define MaxSize 100

typedef struct{

ElemType *elem;

int length;   //顺序表中元素的个数

int listsize;   //顺序表所分配的存储单元个数

} Sqlist;

/*这个结构体类型存放的是顺序表的信息和顺序表的数据*/

 

初始化顺序表

void initSqlist(Sqlist *L)   /*初始化一个顺序表*/

{

   L->elem=(float *)malloc(MaxSize*sizeof(int));    //为顺序表分配MaxSize个元素的空间

   if(!L->elem) exit(0);    //第一个元素不是空指针则返回

/*初始化结构体成员*/

   L->length=0;   //顺序表中没有元素,长度为0

   L->listsize=MaxSize;   //顺序表的最大长度

}           

 

向顺序表中插入元素:

1判断插入位置是否合法

若根据数组索引的习惯,一个长度为n的顺序表插入元素的位置是0到n-1,所以i<0,i>n(应为n-1,可是这样原来长度为0就不行了)皆不合法

2如果分配的内存空间不够,则追加内存空间;

3将表中i-1之后的元素后移一个元素位置(要从后往前遍历)

4将下标为i的位置插入目标元素

 

 

代码:

void insert(Sqlist *L,int i,float m)   /*向顺序表中插入一个元素  L:顺序表的头指针; i要插入的元素的位置(这里使用的是数组习惯的索引方式); m:要插入的数据的内容 */

{

       float *base,*insertPtr,*p;    //base:追加内存空间后顺序表的基地址;insertPtr:插入元素的位置的指针; 

 

  if(i<0||i>L->length)  exit(0);//1插入越界,非法 有效范围是从0开始到元素个数减1

 

       /*2如果顺序表的元素个数超过了顺序表的最大长度,追加内存空间*/ 

  if(L->length>=L->listsize)

  base=(float *)realloc(L->elem,(L->listsize+100)*sizeof(float));    //realloc函数用于在已分配内存基础上追加内存空间,所追加的空间是连续的

  L->elem=base;  //更新内存基地址

  L->listsize+=10;     //存储空间增大10单元

}

 

         insertPtr=&(L->elem[i]);   //给插入元素的位置的指针赋值;

 

        /*3将i-1后的元素顺序后移一个元素的位置*/

for(p=&(L->elem[L->length-1]);p>=insertPtr;p--)    //从后往前遍历,初始位置是顺序表的最后一个元素

{

*(p+1)=*p;   //前一个元素放到后一个的位置,实现顺序后移

            }

 *insertPtr=m;  //4在第i个位置插入要插入的元素

L->length++;//表长递增1;

 

}

 

 

删除顺序表中的元素:

1判断删除位置是否越界(长度为n的顺序表从0到n-1有效)

2i后的元素前移一个元素的位置(要从前往后遍历)

3前移的过程目标元素自然删除;

 

 

/*删除顺序表中的指定元素*/

void del(Sqlist *L,int i)   /*L:顺序表的头指针; i要删除的元素的位置(这里使用的是数组习惯的索引方式)*/

{

       float *delptr,*p;    //delptr:要删除的元素的指针,p:索引指针

 

  if(i<0||i>L->length)  exit(0);//删除越界,非法 有效范围是从0开始到元素个数减1

 

       /*删除不需要追加内存空间*/ 

 

         delptr=&(L->elem[i]);   //给删除元素的位置的指针赋值;

 

        /*将i后的元素顺序前移一个元素的位置*/

for(p=delptr;p<&(L->elem[L->length-1]);p++)    //从前往后遍历,初始位置是顺序表要删除的位置

{

*p=*(p+1);   //后一个元素放到前一个的位置,实现顺序前移

            }

L->length--;

//顺序前移的过程中顺便就把目标元素删除了

 

}

 

 

整体代码:

功能:

1初始化一个顺序表;

2从0到14插入15个数,并将表中所有元素打印出来

3删除下标为4的元素,并将表中所有元素打印出来

 

#include<stdio.h>

#include<stdlib.h>

#define MaxSize 10    //初始:分配10个元素的空间

typedef struct{

float *elem;      //定义了顺序表的基地址,顺序表中的数据的类型是float,也可以是其他类型的数据

int length;     //顺序表中元素的个数

int listsize;    //顺序表的最大长度 

} Sqlist;

void initSqlist(Sqlist *L);

void insert(Sqlist *L,int i,float m);

void del(Sqlist *L,int i);

 

main()

{

    Sqlist item;

     initSqlist(&item);

     int i;

for(i=0;i<15;i++)

{

 insert(&item,i,i);

}

for(i=0;i<item.length;i++)

{

printf("  %f",item.elem[i]);

}

printf("/n/n");

 

     del(&item,4);

for(i=0;i<item.length;i++)

{

printf("  %f/n",item.elem[i]);

}

 

}

void initSqlist(Sqlist *L)   /*初始化一个顺序表*/

{

   L->elem=(float *)malloc(MaxSize*sizeof(int));    //为顺序表分配10个元素的空间

   if(!L->elem) exit(0);    //第一个元素不是空指针则返回

   L->length=0;   //顺序表中没有元素,长度为0

   L->listsize=MaxSize;   //顺序表的最大长度

}

 

void insert(Sqlist *L,int i,float m)   /*向顺序表中插入一个元素  L:顺序表的头指针; i要插入的元素的位置(这里使用的是数组习惯的索引方式); m:要插入的数据的内容 */

{

       float *base,*insertPtr,*p;    //base:追加内存空间后顺序表的基地址;insertPtr:插入元素的位置的指针; 

 

  if(i<0||i>L->length)  exit(0);//插入越界,非法 有效范围是从0开始到元素个数减1

 

       /*如果顺序表的元素个数超过了顺序表的最大长度,追加内存空间*/ 

  if(L->length>=L->listsize)

  base=(float *)realloc(L->elem,(L->listsize+100)*sizeof(float));    //realloc函数用于在已分配内存基础上追加内存空间,所追加的空间是连续的

  L->elem=base;  //更新内存基地址

  L->listsize+=10;     //存储空间增大10单元

}

 

         insertPtr=&(L->elem[i]);   //给插入元素的位置的指针赋值;

 

        /*将i-1后的元素顺序后移一个元素的位置*/

for(p=&(L->elem[L->length-1]);p>=insertPtr;p--)    //从后往前遍历,初始位置是顺序表的最后一个元素

{

*(p+1)=*p;   //前一个元素放到后一个的位置,实现顺序后移

            }

 *insertPtr=m;  //在第i个位置插入要插入的元素

L->length++;//表长递增1;

 

}

 

 

 

 

/*删除顺序表中的指定元素*/

void del(Sqlist *L,int i)   /*L:顺序表的头指针; i要删除的元素的位置(这里使用的是数组习惯的索引方式)*/

{

       float *delptr,*p;    //delptr:要删除的元素的指针,p:索引指针

 

  if(i<0||i>L->length)  exit(0);//删除越界,非法 有效范围是从0开始到元素个数减1

 

       /*删除不需要追加内存空间*/ 

 

         delptr=&(L->elem[i]);   //给删除元素的位置的指针赋值;

 

        /*将i后的元素顺序前移一个元素的位置*/

for(p=delptr;p<&(L->elem[L->length-1]);p++)    //从前往后遍历,初始位置是顺序表要删除的位置

{

*p=*(p+1);   //后一个元素放到前一个的位置,实现顺序前移

            }

L->length--;

//顺序前移的过程中顺便就把目标元素删除了

 

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值