資料結構 順序表

2021-05-23 02:28:44 字數 4042 閱讀 5099

順序表的特徵:

1由唯一的表名標識;

2佔據一塊連續的儲存空間;

3資料順序存放,元素之間有先後關係;

定義動態的順序表:

#define maxsize 100

typedef struct 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:要插入的資料的內容 */

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

#include

#define maxsize 10    //初始:分配10個元素的空間

typedef struct 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;iprintf("  %f",item.elem[i]);

printf("/n/n");

del(&item,4);

for(i=0;iprintf("  %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:要插入的資料的內容 */

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

//順序前移的過程中順便就把目標元素刪除了

資料結構 順序表

順序表示最簡單的乙個資料結構,直接貼 吧,因為比較簡單。include include typedef struct sqlist sqlist void initlist sqlist l l length 0 void getelem sqlist l 初始化 l length j printf...

資料結構順序表

include include include include include include include include include include include include include include using namespace std define maxn 100000...

資料結構 順序表

1.線性表 2.鍊錶 標頭檔案 ifndef list h define list h const int maxlen 100 順序表的最大儲存長度 template class list template void list setlist cin.clear template list lis...