1. 程式人生 > >(數據結構)順序存儲的線性表

(數據結構)順序存儲的線性表

計算機 ear func 可行性 cat 特性 一對一 輸出 code

---恢復內容開始---

推薦一本學習書籍:程傑的《大話數據結構》。

既然是數據結構,那什麽是數據結構呢?這裏補充一些基本術語和概念。

數據結構: 是一門研究非數值計算的程序設計問題中的操作對象,以及它們之間的關系和操作等相關問題的學科。

  • 數據: 是描述客觀事物的符號,是計算機中可以操作的對象,是能被計算機識別,並輸入給計算機處理的符號總集。
  • 數據元素: 是組成數據、有一定意義的基本單位,在計算機中通常作為整體處理。也成為記錄。
  • 數據項: 一個數據元素可以由若幹個數據項組成。數據項是數據不可分割的最小單位。
  • 數據對象: 是性質相同的數據元素的集合,是數據的子集。
  • 數據結構:是相互之間存在一種或多種特定關系的數據元素的集合。
  • 邏輯結構:是指數據對象中數據元素之間的相互關系。
  • 集合結構:集合結構中的數據元素除了屬於同一個集合外,它們之間沒有其他關系。
  • 線性結構:線性結構中的數據元素之間是一對一的關系。
  • 樹形結構:樹形結構中的數據元素之間存在一種一對多的層次關系。
  • 圖形結構:圖形結構的數據元素是多對多的關系。
  • 物理結構:是指數據的邏輯結構在計算機中的存儲形式
  • 順序存儲結構:是把數據元素存放在地址連續的存儲單元裏,其數據將的邏輯關系和物理關系是一致的。
  • 鏈式存儲結構:是把數據元素存放在任意的存儲單元裏,這組存儲單元可以是連續的,也可以是不連續的。
  • 數據類型:是指一組性質相同的值的集合及定義在此集合上的一些操作的總稱。
  • 抽象數據類型:是指一個數學模型及定義在該模型上的一組操作。
  • 算法:是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作。
  • 算法的5個基本特性:輸入,輸出,有窮性,確定性和可行性。

  本篇學習線性表,線性表是什麽?

  • 線性表(List):零個或多個數據元素的有限序列。

  頭部定義(seq_header.h)

#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
#define ok 1
#define error 0
#define true 1
#define false 0
typedef int status;
typedef 
int elemType; typedef struct{ elemType data[maxsize]; int length;//current length of Sqlist }SqList;

線性表操作函數(seq_func.h)

/*輸出指定數據*/
status visit(elemType e){
    printf("%d ", e);
    return ok;
}
/*判斷線性表是否為空*/
status listEmpty(SqList L){
    if(L.length == 0)
        return true;
    else
        return false;
}
/*清除線性表*/
status clearList(SqList *L){
    L->length = 0;
    return ok;
}
/*返回線性表數據元素個數*/
int listLength(SqList L){
    return L.length;
}
/*初始條件: 順序線性表L已存在,1 <= i <= listLength(L)*/
/*操作結果: 刪除L的第i個數據元素,並用e返回其值,L得長度減1*/
status listDelete(SqList *L, int i, elemType *e){
    int k;
    if(L->length == 0)
    return error;
     if(i < 1 || i>L->length)
     return error;
     *e=L->data[i-1];
     if(i < L->length){
         for(k = i; k<L->length; k++)
             L->data[k-1] = L->data[k];
     }
     L->length--;
     return ok;
}
/**
    Status: if ok return OK(=1)
    Condition: SqList already exists, 1 <= i <= ListLength(SqList)
    Result: use e to return the index of i value in SqList
*/

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;
}
/*初始化順序線性表*/
status initList(SqList *L){
    L->length = 0;
    return ok;
}
/*初始條件: 順序線性表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)/*插入的位置超過範圍*/
        return error;
    if(i <= L->length){/*插入的位置不在表尾*/
        for(k = L->length - 1; k >= i-1; k--)
            L->data[k+1] = L->data[k];
    }
    L->data[i-1] =e;
    L->length++;
    return ok;
}

/*初始條件:順序線性表L已存在*/
/*操作結果:依次對L的每個數據元素輸出*/
status listTrave(SqList L){
    int i;
    for(i = 0; i<L.length; i++)
        visit(L.data[i]);
    printf("\n");
    return ok;
}
/*初始條件: 順序線性表L已存在*/
/*操作結果: 返回L中第1個與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;
}
/*將後一個線性表合並到前一個線性表上*/
void unionL(SqList *La, SqList Lb){
    int La_len, Lb_len, i;
    elemType e;
    La_len = listLength(*La);
    Lb_len = listLength(Lb);
    for(i = 1; i<=Lb_len; i++){
        getElem(Lb, i, &e);
        if(!locateElem(*La, e))
            listInsert(La, ++La_len, e);
    }
}

主函數測試(main.cpp)

#include "seq_header.h"
#include "seq_func.h"
int main(){
    SqList L;//定義一個順序線性表 
    elemType e; 
    status i;
    int j, k;
    i = initList(&L);//初始化一個順序線性表
    printf("初始化後L:L.length = %d\n", L.length);
    for(j = 1; j <= 5; j++)
         i = listInsert(&L, j, j);
    printf("在L的表頭依次插入1~5後: L.data = ");
    listTrave(L);
    printf("L.length = %d \n", L.length);
    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(1:是 0:否)\n", i); 
    
    for(j = 1; j <= 10; j++)
        listInsert(&L, 1, j);
    printf("在L的表尾依次插入1~10後:L.data=");
    listTrave(L);
    
    printf("L.length = %d \n", L.length);
    getElem(L, 5, &e);
    printf("第5個元素為:%d\n", e);
    for(j = 3; j <= 4; j++){
        k = locateElem(L, j);
        if(k)
            printf("第%d個元素的值為%d\n", k, j);
        else
            printf("沒有值為%d的元素\n",j);
    }
    
    j = 5;
    listDelete(&L, j ,&e);
    printf("刪除第%d個元素值為:%d\n", j, e);
    
    printf("依次輸出L的元素:");
    listTrave(L);
    
    //構造一個有10個數的Lb
    SqList Lb;
    i = initList(&Lb);
    for(j=6; j<= 15; j++){
        i = listInsert(&Lb, 1, j);
    }
        
    unionL(&L, Lb);
     printf("依次輸出了合並了Lb的L的元素:");
     listTrave(L);

    return 0;
}

(數據結構)順序存儲的線性表