線性表的順序儲存——順序表
阿新 • • 發佈:2018-11-07
線性表可以按照其儲存結構劃分為順序表、連結串列。如下圖:
順序表:用一組地址連續的儲存空間,儲存表中的元素。則=可以看出有以下幾個特點:
順序表的描述:
(1)陣列靜態分配
#define Maxsize 30 typedef int ElemType; typedef struct{ ElemType data[Maxsize]; int length; }SqList;
(2)陣列動態分配
#define Maxsize 30
typedef int ElemType;
typedef struct{
ElemType *data;
int length;
}SqList;
【注意】
L.data=(ElemType *)malloc(sizeof(ElemType )*InitSize);//C初始記憶體分配語句
L.data= new ElemType[InitSize];//C++
基本操作:
InitList(&L):初始化線性表。構造一個空的線性表。 Length(L):求表長。 LocateElem(L,e):按值查詢。 GetElem(L,i):獲取表L中第i個位置上的元素的值。 ListInsert(&L,i,e):在第i個位置插入元素e。 ListDelete(&L,i,&e):刪除第i個位置的元素,並用e返回其值。 PrintList(L):輸出L。 Empty(L):判空。 DestroyList(&L):銷燬,釋放空間。
常見基本操作具體程式碼:
void InitList(SqList &L){
L.length=0;
}
void ListInsert(SqList&L,int i,ElemType e){//在第i個位置插入元素e。 //判斷i是否有效 if(i<1||i>L.length+1){ printf("插入位置有誤!\n"); } //判斷空間是否已滿 if(L.length>=Maxsize){ printf("儲存空間已滿!\n"); } //插入,從第i個元素起,所有元素向後移 for(int j=L.length;j>=i;j--){ L.data[j]=L.data[j-1]; } //給第i個位置賦值 L.data[i-1]=e; //表長增加 L.length++; }
void ListDelete(SqList &L,int i,ElemType &e){//刪除第i個位置的元素,並用e返回其值
//判斷i是否合法
if(i<1||i>L.length)
{
printf("輸入不合法!\n");
}
//將第i個位置的值賦值給e
e=L.data[i-1];
//把從第i+1個元素起向前移
for(int j=i+1;j<=L.length;j++){
L.data[j-2]=L.data[j-1];
}
//修改表長
L.length--;
}
int LocateElem(SqList L,ElemType e){//按值查詢,存在返回位置,否則返回0
for(int i=0;i<L.length;i++){
if(L.data[i]==e){
return i+1;
}
}
return 0;
}
void PrintList(SqList L){
int i=0;
printf("線性表元素為:\n");
while(i<L.length){
printf("%d ",L.data[i]);
i++;
}
printf("\n");
}
int Length(SqList L){
return L.length;
}
完整測試的主函式如下:
void main(){
SqList L;
InitList(L);
for(int i=1;i<=10;i++){
ListInsert(L,i,i);
}
printf("表長:%d\n",Length(L));
PrintList(L);
ElemType ch;
int pos;
printf("請輸入要刪除的元素位置:\n");
scanf("%d",&pos);
ListDelete(L,pos,ch);
printf("刪除%d之後:\n",ch);
printf("表長:%d\n",Length(L));
PrintList(L);
printf("請輸入要查詢的元素值:\n");
scanf("%d",&ch);
if(LocateElem(L,ch)==0){
printf("表中不存在此元素!\n");
}else{
printf("此元素!\n");
}
}
結果如下: