顺序表的特征:
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--;
//顺序前移的过程中顺便就把目标元素删除了
}