資料結構-線性表

來源:互聯網
上載者:User

標籤:

 

線性表定義:
  1、0個或多個元素的集合
  2、元素之間是有序的
  3、元素個數有限
  4、元素資料的類型必須相同

線性表是相同類型的n個資料元素的有限序列。
逐項訪問,順序儲存
前驅 後繼

 

線性表的順序儲存結構:

SeqList.h

#ifndef _SEQLIST_H_#define _SEQLIST_H_typedef void SeqList;typedef void SeqListNode;/*    該方法用於建立並且返回一個空的線性表*/SeqList* SeqList_Create(int capacity);/*    該方法用於銷毀一個線性表list*/void SeqList_Destroy(SeqList* list);/*    該方法用於將一個線性表list中的所有元素清空    使得線性表回到建立時的初始狀態*/void SeqList_Clear(SeqList* list);/*    該方法用於返回一個線性表list中的所有元素個數*/int SeqList_Length(SeqList* list);int SeqList_Capacity(SeqList* list);/*    該方法用於向一個線性表list的pos位置處插入新元素node    傳回值為1表示插入成功,0表示插入失敗*/int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);/*    該方法用於擷取一個線性表list的pos位置處的元素    傳回值為pos位置處的元素,NULL表示擷取失敗*/SeqListNode* SeqList_Get(SeqList* list, int pos);/*    該方法用於刪除一個線性表list的pos位置處的元素    傳回值為被刪除的元素,NULL表示刪除失敗*/SeqListNode* SeqList_Delete(SeqList* list, int pos);#endif

 

SeqList.c

#include <stdio.h>#include <malloc.h>#include "SeqList.h"typedef unsigned int TSeqListNode;typedef struct _tag_SeqList{    int capacity;    int length;    TSeqListNode* node;} TSeqList;SeqList* SeqList_Create(int capacity) // O(1){    TSeqList* ret = NULL;        if( capacity >= 0 )    {        ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);    }        if( ret != NULL )    {        ret->capacity = capacity;        ret->length = 0;        ret->node = (TSeqListNode*)(ret + 1);    }        return ret;}void SeqList_Destroy(SeqList* list) // O(1){    free(list);}void SeqList_Clear(SeqList* list) // O(1){    TSeqList* sList = (TSeqList*)list;        if( sList != NULL )    {        sList->length = 0;    }}int SeqList_Length(SeqList* list) // O(1){    TSeqList* sList = (TSeqList*)list;    int ret = -1;        if( sList != NULL )    {        ret = sList->length;    }        return ret;}int SeqList_Capacity(SeqList* list) // O(1){    TSeqList* sList = (TSeqList*)list;    int ret = -1;        if( sList != NULL )    {        ret = sList->capacity;    }        return ret;}int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) // O(n) {    TSeqList* sList = (TSeqList*)list;    int ret = (sList != NULL);    int i = 0;        ret = ret && (sList->length + 1 <= sList->capacity);    ret = ret && (0 <= pos);        if( ret )    {        if( pos >= sList->length )        {            pos = sList->length;        }                for(i=sList->length; i>pos; i--)        {            sList->node[i] = sList->node[i-1];        }                sList->node[i] = (TSeqListNode)node;                sList->length++;    }        return ret;}SeqListNode* SeqList_Get(SeqList* list, int pos) // O(1) {    TSeqList* sList = (TSeqList*)list;    SeqListNode* ret = NULL;        if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )    {        ret = (SeqListNode*)(sList->node[pos]);    }        return ret;}SeqListNode* SeqList_Delete(SeqList* list, int pos) // O(n){    TSeqList* sList = (TSeqList*)list;    SeqListNode* ret = SeqList_Get(list, pos);    int i = 0;        if( ret != NULL )    {        for(i=pos+1; i<sList->length; i++)        {            sList->node[i-1] = sList->node[i];        }                sList->length--;    }        return ret;}

main.c

#include <stdio.h>#include <stdlib.h>#include "SeqList.h"/* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char *argv[]) {    SeqList* list = SeqList_Create(5);        int i = 0;    int j = 1;    int k = 2;    int x = 3;    int y = 4;    int z = 5;    int index = 0;        SeqList_Insert(list, &i, 0);    SeqList_Insert(list, &j, 0);    SeqList_Insert(list, &k, 0);    SeqList_Insert(list, &x, 0);    SeqList_Insert(list, &y, 0);    SeqList_Insert(list, &z, 0);        for(index=0; index<SeqList_Length(list); index++)    {        int* p = (int*)SeqList_Get(list, index);                printf("%d\n", *p);    }        printf("\n");        while( SeqList_Length(list) > 0 )    {        int* p = (int*)SeqList_Delete(list, 0);                printf("%d\n", *p);    }        SeqList_Destroy(list);        return 0;}

 

優點:

  無需為線性表中的邏輯關係增加額外的空間

  可以快速擷取表中合法位置的元素

缺點:

  插入和刪除需要移動大量的元素。

  當線性表長度變化較大時難以確定儲存空間的容量。

 

資料結構-線性表

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.