順序存儲的線性表的基本操作


剛開始學數據結構,幾乎算是什么都不會,想記錄一下學習的東西,所以就學別人開始寫博客。

 

 

剛學了順序存儲的線性表的基本操作,把操作寫了一遍。可能會有錯誤。

 

順序存儲的線性表,用結構體類型。注意:結構體並不是用來存儲元素的,elem才是存儲元素的首地址

1 typedef struct
2 {
3     ElemType *elem;//存儲空間基地址
6     int length;//表長
7     int listsize;//表容量
8 }SqList;

 

初始化:構造空表L,返回一個狀態,需要帶回一個表給基地址動態分配一定大小的空間,表長賦0,表容量賦值

注意:開辟內存失敗;

1 Status InitList_Sq(SqList &L)//L為結構體的一個變量,所以在使用它的成員時用L.
2 {
3     L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
4     if(!L.elem)
5     exit(OVERFLOW);
6     L.length=0;
7     L.listsize=LIST_INIT_SIZE;
8     return OK;
9 }

 

 

創建表:先初始化,再依次輸入每個元素,返回狀態,傳一個表、輸入幾個數,帶回一個表

注意:每輸入一個表長+1 這里的輸入不通用,只能輸入整型數據。也可以用初始化和插入函數實現

 1 Status CreaList_Sq(SqList &L,int n)
 2 {
 3     L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
 4     if(!L.elem)
 5     exit(OVERFLOW);
 6     L.length=0;
 7     L.listsize=LIST_INIT_SIZE;//初始化
 8 
 9     ElemType *p;
10     p=L.elem;//為了練習指針,所以多用
11     while(p<=L.elem+n-1)
12     {
13         scanf("%d",p);//p本身就是地址,與&*p含義相同;
14         L.length++;
15         p++;//別忘了
16     }
17     return OK;
18 
19 }

 

 

銷毀表:返回狀態,傳一個表,帶回把空間釋放,表長和表容量賦0

注意:釋放空間

1 Status DestroyList_Sq(SqList &L)
2 {
3     free(L.elem);
4     L.elem=NULL;
5     L.length=0;
6     L.listsize=0;
7     return OK;
8 }

 

 

清空表:把表長賦0,返回狀態,帶回表區別於銷毀表

注意:

1 Status ClearList_Sq(SqList &L)
2 {
3     L.length=0;
4     return 0;
5 }

 

 

判空謂詞:返回狀態,傳入一個表,看表長
注意:

1 Status IsListEmpty(SqList L)

2 {

3 return L.length==0? TRUE:FALSE;

4 } (為什么不自動分行了)

 

 

表長:返回表中數據元素個數 傳一個表

注意:

int ListLength(SqList L)
{
    return L.length;
}

 

 

獲取第i個元素:返回狀態,傳一個表,位置,存第i個元素的變量,帶回該變量

注意:i的位置不合法

 1 Status GetElem_Sq(SqList L,int i,ElemType &e)
 2 {
 3     if(i<1||i>L.length)
 4     return ERROR;//正常人都從1開始數數
 5 
 6     e=*(L.elem+i-1);
 7 
 8     return OK;
 9 
10 }

 

 

查找:查找符合條件的第一個元素,返回它的位序傳一個表,要查的元素,一個函數指針

注意:

 1 int LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
 2 {
 3     ElemType *p=L.elem;
 4     int i=1;//記錄位置
 5     while(p<=L.elem+L.length-1&&compare(*p,e)==FALSE)//或寫成(*compare)(*p,e);
 6     {
 7         p++;
 8         i++;
 9     }
10     if(p<=L.elem+L.length-1)
11     return i;
12 
13     return ERROR;
14 }

寫一個函數指針對應的比較謂詞吧

1 Status IsEqual(ElemType a,ElemType e)

2 {

3 return a==e? TRUE:FALSE;

4 } 

 

 

元素的前驅:找到第一個該元素,如果不是第一個,就帶回它的前驅返回狀態,傳一個表,一個元素,一個帶回元素的變量

注意:第一個元素

Status PriorElem_Sq(SqList L,ElemType cur_e,ElemType &pre_e)
{
    int i=1;
    ElemType *p=L.elem;
    while(i<=L.length&&*p!=cur_e)
    {
        p++;
        i++;
    }
    if(i!=1&&i<=L.length)
    {
        pre_e=*(L.elem+i-2);
        return OK;
    }

    return ERROR;

}

 

 

元素的后繼:帶回一個元素的后一個返回一個狀態,傳一個表,一個該元素,一個帶回元素的變量

注意:最后一個元素

Status NextElem_Sq(SqList L,ElemType cur_e,ElemType &nex_e)
{
    ElemType *p=L.elem;
    int i=1;
    while(i<=L.length&&*p!=cur_e)
    {
        p++;
        i++;
    }

    if(i<L.length)
    {
        nex_e=*(L.elem+i);//注意帶回的是誰
    }

    return ERROR;
}

 

 

插入:在第i個元素前插入一個元素返回狀態,傳入一個表,位置i,元素,帶回一個表

注意:i的位置不合法,表長+1,表滿擴容

Status ListInsert_Sq(SqList &L,int i,ElemType e)
{
    if(i<=0||i>L.length+1)
    return ERROR;

    if(L.length>=L.listsize)
    {
        L.elem=(ElemType *)realloc(L.elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));
        if(!L.elem)
        exit(OVERFLOW);
        L.listsize+=LISTINCREMENT;
    }//擴容

    for(int j=L.length;j>=i;--j)
    *(L.elem+j)=*(L.elem+j-1);//第i個元素后移

    *(L.elem+i-1)=e;
    L.length++;

    return OK;
}

 

 

 

刪除:輸出第i個元素,並帶回它返回狀態,傳一個表,位置i,一個帶回元素的變量,帶回表

注意:i的位置,表長-1,帶回元素

 1 Status ListDelete_Sq(SqList &L,int i,ElemType &e)
 2 {
 3     if(i<1||i>L.length)
 4     return ERROR;
 5 
 6     e=*(L.elem+i-1);
 7 
 8     for(int j=i;j<L.length;++j)//注意結束位置是到數第二個
 9     {
10         *(L.elem+j-1)=*(L.elem+j);
11     }
12 
13     --L.length;
14 
15     return OK;
16 }

 

 

遍歷:依次對表中的元素執行一個傳入的操作,如果執行失敗就返回錯誤返回狀態,傳一個表和函數指針

注意:空表

 1 Status ListTraverse(SqList L,Status (*vist)(ElemType))
 2 {
 3     if(!L.length)
 4     return ERROR;
 5 
 6     ElemType *p=L.elem;
 7     while(p<=L.elem+L.length-1)
 8     {
 9         if(!vist(*p))//或者(*vist)(*p);
10         return ERROR;
11         p++;
12     }
13 
14     return OK;
15 
16 }

寫一個與函數指針對應的

1 Status Print_e(ElemType e)

2 {

3 printf("%d ",e);

4} (或許只要一句話就會這樣)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM