順序表的功能實現

2021-06-26 11:45:08 字數 3666 閱讀 2492

順序表的建立,插入,刪除,清空,銷毀,查詢,輸出功能

#include

#include

#include

#definetrue 1

#definefalse 0

#defineok 1

#defineerror 0

#defineinfeasible -1

#defineoverflow -2

typedefint status ;

typedefint elemtype ;

//線性表的動態分配順序儲存結構

#definelist_init_size 100  //線性表儲存空間的初始分配量

#definelistintcrement 10  //線性表儲存空間的分配增量

typedefstruct

elemtype *elem ; // 儲存空間基址

int length ; //當前長度

int listsize ; //當前分配的儲存容量

}sqlist;

//初始化順序表

statusinitlist_sq(sqlist &l)

l.elem = (elemtype * )malloc(list_init_size*sizeof(elemtype)) ;

if(!l.elem)

exit(overflow) ; //儲存空間分配失敗

l.length = 0 ;  //空表長度為0

l.listsize = list_init_size ; // 初始儲存容量

return ok ;

voidcreatelist(sqlist&l) //建立順序表

int i; 

printf("請輸入你要建立的順序表元素個數");

scanf("%d",&l.length); 

printf("請輸入你要建立的順序表:\n");

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

scanf("%d" , &l.elem[i]) ;

//查詢

statuslocation( sqlist &l,elemtype e)//查詢元素的位置

int i = 0 ;

while(l.elem[i]!=e &&ii++;

if(i>l.length)  return -1;

else return i+1;//因為c語言是從下標0開始的當i=0時實際上是順序表的第i+1個元素

//在順序表中第i個位置插入乙個新的元素e

statuslistinsert_sq(sqlist &l ,int i ,elemtype e)

elemtype *newbase,*q,*p;

if(i < 1 || i > l.length+1 )

return error ; // i不合法

if(l.length >= l.listsize)

//當前儲存空間已滿,增加分配

newbase = (elemtype *)realloc(l.elem , (l.listsize+listintcrement) * sizeof(elemtype)) ;

if(!newbase)

exit(overflow) ;// 分配位址失敗

l.elem = newbase ;   //新基址

l.listsize +=listintcrement ; // 增加儲存容量

q = &(l.elem[i-1]) ; //q為插入位置

for(p = &(l.elem[l.length - 1]) ; p>= q ; --p )

*(p+1) = *p ;//插入位後的元素右移

*q = e ;  //插入e

++l.length ; //表長加1

return ok ;

//在順序表中刪除第i個元素,並用e返回其值

statuslistdelete_sq(sqlist &l , int i , elemtype &e)

elemtype *q,*p;

if(i < 1 || i > l.length+1 )

return error ; // i不合法

p = &(l.elem[i-1]) ; //p為被刪除元素的位置

e = *p ;//被刪除元素的值賦給e

q = l.elem + l.length - 1 ;//表尾元素的位置

for(++p ; p <=q ; ++p)

*(p - 1) = *p ; //被刪除的元素之後的元素左移

--l.length ; //表長減1

return ok ;

//判斷表是否為空

statuslistempty(sqlist &l)

{ //如果l為空表,返回true,否則返回false

if(l.length==0)

printf("此表為空表\n");

return true ;

else return false;

//將表置空

void clearlist(sqlist &l)//將l重置為空表

for(int i = 0; i < l.length; i++)

l.elem[i] = null;

printf("表已經清空\n");

//銷毀表

voidburning_list(sqlist &l)

l.length = 0;

//  free(l) ;

printf("表已經銷毀\n");

void print( sqlist &l)//輸出順序表

int i ; 

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

printf("%3d" , l.elem[i]);

printf("\n") ;

voidmain()

sqlist la ;

int i , j ; 

elemtype e ;

initlist_sq(la) ;

createlist(la) ;//建立表

//查詢

printf("請輸入要查詢的元素:\n") ;

scanf("%d" , &e) ;

j=location(la , e) ; 

printf("該元素的位置為%d\n" , j) ;

//插入

printf("請輸入要插入的位置和元素:\n");

scanf("%d%d" , &i , &e) ;

listinsert_sq(la,i,e) ; 

printf("輸出插入後的順序表:\n") ;

print(la) ; 

//刪除

printf("請輸入要刪除的位置:\n") ;

scanf("%d" , &i) ; 

listdelete_sq(la,i,e) ; 

printf("刪除的那個元素是:%d\n" , e) ;

printf("輸出刪除後的順序表:\n") ;

print(la) ;

//清空

clearlist(la) ;

print(la) ;

//銷毀

burning_list(la) ;

print(la) ;

動態順序表的功能實現

在了解線性結構後我們知道它可分為順序表和煉表兩種,而順序表又分為靜態順序表 和動態順序表.靜態順序表和靜態通訊錄的實現極為相似,但是我們知道靜態版本有著明顯的缺陷,空間分配太大易造成浪費,太小又不便儲存,而動態版本正好可以解決這個問題。既然前面提到線性結構的組成,那麼我們就在說說鍊錶分為哪些 它可分...

C 順序表全功能實現

編譯環境 vs2008 pragma once include include include define max size 100 enum typedef int datatype typedef struct seqlist seqlistr int i,m,n 初始化,銷毀 void se...

順序表 簡單功能

ifndef seqlist h define seqlist h include include includeusing namespace std define elemtype int define seqlist default size 10 typedef struct seqlist...