1.線性表定義:0個或多個數據元素的有限序列。
2.線性表的順序存儲結構:是指用一段地址連續的存儲單元依次存儲線性表的數據元素。
3.線性表的順序存儲結構通常可藉助數組實現。
注意:①一般,數組長度固定;線性表長度可變。因此,用數組存放線性表數據時,定義的數組大小要大於等於線性表長度。②線性表中的元素從1開始數,數組下標從0開始,因此,數組a[0]存放線性表的第1個數,同理,a[i]存放第i+1個數。
4.線性表順序存儲結構的優缺點:
5.代碼實現:
#include <stdlib.h>
#include <iostream>
/************************************************************************/
/* (1)線性順序存儲:地址連續 */
/************************************************************************/
#define MaxSize 20 //存儲空間初始分配量
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status; //Status是函數的類型,其值是函數結果狀態代碼,如OK等
typedef int ElemType; //元素類型依據實際情況決定
Status visit(ElemType c)
{
printf("%d",c);
return OK;
}
typedef struct //定義SqList線性表結構
{
ElemType data[MaxSize];
int length;
}SqList;
//初始化順序線性表
Status InitList(SqList *L)
{
L->length=0;
return OK;
}
/* 初始條件:順序線性表L已存在。操作結果:若L爲空表,返回true;否則返回false*/
Status ListEmpty(SqList L)
{
if(L.length == 0)
return TRUE;
else
return FALSE;
}
/* 初始條件:順序線性表已經存在。操作結果:將L重置爲空表*/
Status ClearList(SqList *L)
{
L->length=0;
return OK;
}
/* 初始條件:L順序線性表L已經存在。操作結果:返回L中數據元素的個數*/
int ListLength(SqList L)
{
return L.length;
}
/* 初始條件:順序線性表L已經存在,1=<i<=ListLength(L)*/
/* 操作結果:用e返回L中第i個數據元素的值,注意i是指位置,第一個位置下標從0k開始*/
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length==0 ||i<1 || i>L.length)
return ERROR;
*e = L.data[i-1];
return OK;
}
/* 初始條件:順序線性表L已經存在*/
/* 操作結果:返回L中第一個與e滿足關係的數據元素的位序;若這樣的元素不存在,則返回0*/
int LocateElem(SqList L,ElemType e)
{
int i;
if (L.length == 0)
return 0;
for (i=0;i<L.length;i++)
{
if (L.data[i] ==e)
break;
}
if (i>=L.length)
return 0;
return i+1;
}
/* 初始條件:順序線性表L已經存在,1<=i<=ListLength(L)*/
/* 操作結果:在L中的第i個位置之前插入新的元素e,L的長度加1*/
Status ListInsert(SqList *L, int i,ElemType e)
{
int k;
if(L->length == MaxSize)
return ERROR;
if (i<1 || i>L->length +1) //插入的位置i比第一個位置小、或比最後一個位置大
return ERROR;
if (i<=L->length)
{
for (k=L->length-1;k>=i-1;k--)
{
L->data[k+1] = L->data[k];//位置i及其後面的元素統一後移一位
}
}
L->data[i-1]=e; //插入新元素
L->length++;//線性表長度加1
return OK ;
}
/* 初始條件:順序線性表L已經存在,1<=i<=ListLength(L)*/
/* 操作結果:刪除第i個數據元素,並用e返回其值,L的長度減1*/
Status ListDelete(SqList *L,int i,ElemType *e)
{
if (L->length == 0)
return ERROR;
if (i<1 || i>L->length+1)
return ERROR;
*e=L->data[i-1];
if (i<=L->length)
{
for(int k=i-1;k<L->length-1;k++)
L->data[k]=L->data[k+1];
}
L->length--;
return OK;
}
/* 初始條件:順序線性表L已經存在*/
/* 操作結果:依次對L的每個數據元素輸出*/
Status ListTravese(SqList L)
{
int i;
for (i=0;i<L.length;i++)
visit(L.data[i]); //這個visit函數是在最開始自定義的打印輸出函數
printf("\n");
return OK;
}
//將兩個順序線性表組合爲一個線性表
void unionL(SqList *La,SqList Lb)
{
int La_len,Lb_len,i;
ElemType e;
La_len=La->length;
Lb_len=Lb.length;
for(int i=0;i<Lb_len;i++)
{
GetElem(Lb,i,&e);
if (!LocateElem(*La,e))
{
ListInsert(La,++La_len,e);
}
}
}
int main()
{
SqList L;
ElemType e;
Status i;
int j,k;
i=InitList(&L);
printf("初始化L之後:L.length=%d",L.length);
printf("\n");
for(j=1;j<=5;j++)
i=ListInsert(&L,1,j);
printf("在表頭依次插入1~5之後:L.data=\n");
ListTravese(L);
/*for(int k=0;k<L.length;k++)
printf("%d",L.data[i]);*/
printf("L.length=%d\n",L.length);
printf("\n");
i=ListEmpty(L);
printf("L是否爲空:i=%d(1:是;0:否)\n",i);
i=ClearList(&L);
printf("清空L後:L.length=%d\n",L.length);
i=ListEmpty(L);
printf("判斷L是否爲空i=%d\n",i);
for(j=1;j<=10;j++)
ListInsert(&L,j,j);
printf("在對應位置依次插入1~10之後,L.data=");
ListTravese(L);
printf("\n");
printf("L.length=%d\n",L.length);
ListInsert(&L,1,2);
printf("在表頭插入0後,L.data=");
ListTravese(L);
printf("\n");
printf("L.length=%d\n",L.length);
GetElem(L,5,&e);
printf("第5個元素是:%d\n",e);
getchar();
}