線性表--順序線性表-基本操作:建表,插入,刪除


代碼里面的一些 define先了解一下:

#define LIST_INIT_SIZE 100   //線性表的初始建立長度
#define LISTINCREMENT 10     //每次增加的長度
#define ElemType int //線性表的存儲的基本數據型 #define OK 1 #define OVERFLOW -2 #define ERROR -1 #define Status int

 

 我用的書是嚴蔚敏的《數據結構(C語言版)》 紫色書。

書上的代碼都很好理解,學習時候碰到過的小問題會總結提醒一下。

1. 函數會出現 類似於 void MergeList(List La,List Lb, List &Lc) 這樣的函數定義,一開始我也是直接照着抄上了,記着在用C++時用過,結果一直報錯,

百度一下發現,C語言是沒有&Lc這種形式的形參的,在C++中叫做引用。

2. 所以傳入函數的應該是線性表的地址,函數里面對線性表的操作都要用指針實現  例如:L.length  要改成 L->length

 

1 Status InitList_Sq(Sqlist *L)
2 {   //構造一個空的線性表
3     L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
4     if(!L->elem) exit(OVERFLOW);  //儲存分配失敗
5     L->length = 0;                //空表長度為0
6     L->listsize = LIST_INIT_SIZE; //初始存儲容量
7     return OK;
8 }//InitList_Sq
 1 Status ListInsert_Sq(Sqlist *L, int i, ElemType e)
 2 {
 3     //在順序線性表L中第i個位置之前插入新的元素e
 4     //i的合法值為1<=i<=ListLength_Sq(L) + 1
 5     ElemType *newbase, *q, *p;
 6 
 7     if(i < 1 || i > L->length + 1) return ERROR;//i值不合法
 8     if(L->length >= L->listsize)                //當前存儲空間已滿,增加分配
 9     {
10         newbase = (ElemType *)realloc(L->elem,
11                     (L->listsize + LISTINCREMENT)*sizeof(ElemType));
12         if(!newbase) return ERROR;     //分配失敗
13         L->elem = newbase;             //新基址
14         L->listsize += LISTINCREMENT;  //增加存儲容量
15     }
16     q = &L->elem[i-1];                 //q為插入位置
17     for(p = &L->elem[L->length-1]; p >= q; --p)
18         *(p+1) = *p;                   //插入位置及之后的元素后移
19     *q = e;         //插入e
20     L->length++;    //表增長1
21     return OK;
22 }//ListInsert_Sq
 1 Status ListDelete_Sq(Sqlist *L, ElemType i, ElemType *e)
 2 {
 3     //在順序線性表L中刪除第i個元素,並用e返回其值
 4     //i的合法值為1<=i<=ListLength_Sq(L)
 5     ElemType *p, *q;
 6     if(i < 1 || i > L->length + 1) return ERROR;//i 值不合法
 7 
 8     p = &L->elem[i-1];                //p為被刪除元素的位置
 9     *e = *p;                         //被刪除元素的值賦給e
10     q = &L->elem[i] + L->length - 1;//表尾元素的位置
11     for(++p; p <= q; p++)           //++p為要移動元素的第一個
12         *(p-1) = *p;                //元素左移
13     L->length--;                    //表長減一
14     return OK;
15 }//ListDelete_Sq

下面的完整代碼,可以試一試:

#include <stdio.h>
#include <stdlib.h>

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define ElemType int

#define OK 1
#define OVERFLOW -2
#define ERROR -1
#define Status int

typedef struct{
    ElemType *elem;//存儲空間基址
    int length;     //當前長度
    int listsize;   //當前分配的存儲容量
}Sqlist;

Status InitList_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;
}//InitList_Sq

Status ListInsert_Sq(Sqlist *L, int i, ElemType e)
{
    //在順序線性表L中第i個位置之前插入新的元素e
    //i的合法值為1<=i<=ListLength_Sq(L) + 1
    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 + LISTINCREMENT)*sizeof(ElemType));
        if(!newbase) return ERROR;     //分配失敗
        L->elem = newbase;             //新基址
        L->listsize += LISTINCREMENT;  //增加存儲容量
    }
    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;
}//ListInsert_Sq

Status ListDelete_Sq(Sqlist *L, ElemType i, ElemType *e)
{
    //在順序線性表L中刪除第i個元素,並用e返回其值
    //i的合法值為1<=i<=ListLength_Sq(L)
    ElemType *p, *q;
    if(i < 1 || i > L->length + 1) return ERROR;//i 值不合法

    p = &L->elem[i-1];                //p為被刪除元素的位置
    *e = *p;                         //被刪除元素的值賦給e
    q = &L->elem[i] + L->length - 1;//表尾元素的位置
    for(++p; p <= q; p++)           //++p為要移動元素的第一個
        *(p-1) = *p;                //元素左移
    L->length--;                    //表長減一
    return OK;
}//ListDelete_Sq


int main()
{
    Sqlist L;
    if(!InitList_Sq(&L))
        exit(OVERFLOW);
    int a[ ] = {12, 13, 21, 24, 28, 30, 42, 77};//線性表的元素
    for(int i=0; i<8; i++)  //建表
    {
        L.elem[i] = a[i];
        L.length++;        //記錄長度
    }
    printf("~~~~~~\n");
    for(int i=0; i < L.length; i++)
        printf("%d ",L.elem[i]);
    printf("\nlength = %d\n",L.length);

    printf("\n~~~~~~\n");
    ListInsert_Sq(&L, 5, 25);   //在第五個位置插入值 25
    for(int i=0; i < L.length; i++)
        printf("%d ",L.elem[i]);
    printf("\nlength = %d\n",L.length);

    printf("\n~~~~~~\n");
    int e;
    ListDelete_Sq(&L, 5, &e);  //在第五個位置刪除值  25
    for(int i=0; i < L.length; i++)
        printf("%d ",L.elem[i]);
    printf("\nlength = %d\n",L.length);
    printf("e = %d\n",e);

    printf("\n~~~~~~~\n");
    return 0;

}
View Code

 


免責聲明!

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



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