您的位置:首页 > 理论基础 > 数据结构算法

数据结构——顺序表

2010-07-18 19:32 162 查看
顺序表的特征:

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--;

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: