1. 程式人生 > 其它 >順序表動態實現

順序表動態實現

1、定義一個結構體

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

#define INITSIZE 10        // 順序表的初始長度。
#define EXTSIZE   5        // 每次擴充套件元素的個數。

typedef int ElemType;      // 自定義順序表的資料元素為整數。

typedef struct
{
  ElemType *data;           // 儲存順序表中元素的首地址。
  unsigned int maxsize;     // 順序表元素的最大長度。
  unsigned int length;      // 順序表中元素的個數。
}SeqList,*PSeqList;

int main()
{
  return 0;
}

2、建立一個順序表

int main()
{
  SeqList LL;     // 建立順序表
  return 0;
}

3、建立一個數據元素

int main()
{
  SeqList LL;     // 建立順序表
  ElemType ee;    // 建立一個數據元素。
  return 0;
}

4、建立一個數據元素

void InitList(PSeqList LL);   
void ClearList(PSeqList LL);

int main()
{
  SeqList LL;     // 建立順序表
  ElemType ee;    // 建立一個數據元素。
  InitList(&LL);  // 初始化順序表。
  return 0;
}


void InitList(PSeqList LL)
{
  LL->data=(ElemType *)malloc(sizeof(ElemType)*INITSIZE);
  LL->maxsize=INITSIZE;

  ClearList(LL); // 清空順序表。
}

// 清空順序表。
void ClearList(PSeqList LL)
{
  if (LL == NULL) return;  // 檢查空指標。

  LL->length=0;
  memset(LL->data,0,sizeof(ElemType)*LL->maxsize);
}

5、在表中插入元素

int InsertList(PSeqList LL, unsigned int ii, ElemType *ee);
int ExtList(PSeqList LL);

int main()
{
  SeqList LL;     // 建立順序表
  ElemType ee;    // 建立一個數據元素。
  InitList(&LL);  // 初始化順序表。
  printf("在表中插入元素(1、2、3、4、5、6、7、8、9、10)。\n");
  ee=1;  InsertList(&LL, 1, &ee);
  ee=2;  InsertList(&LL, 1, &ee);
  ee=3;  InsertList(&LL, 1, &ee);
  ee=4;  InsertList(&LL, 1, &ee);
  ee=5;  InsertList(&LL, 1, &ee);
  ee=6;  InsertList(&LL, 1, &ee);
  ee=7;  InsertList(&LL, 1, &ee);
  ee=8;  InsertList(&LL, 1, &ee);
  ee=9;  InsertList(&LL, 1, &ee);
  ee=10; InsertList(&LL, 1, &ee);

  return 0;
}

// 擴充套件順序表的記憶體空間,返回值:0-失敗;1-成功。
int ExtList(PSeqList LL)
{
  // 分配新的記憶體空間。
  ElemType *newdata=(ElemType *)malloc(sizeof(ElemType)*(LL->maxsize+EXTSIZE));

  // 如果分配失敗,返回0。
  if (newdata == NULL) return 0;

  memset(newdata,0,sizeof(ElemType)*(LL->maxsize+EXTSIZE));

  // 把順序表中原來的內容複製到新分配的記憶體空間中。
  memcpy(newdata,LL->data,sizeof(ElemType)*LL->maxsize);

  // 釋放原來的記憶體空間。
  free(LL->data);

  // 把順序表資料元素的指標指向新分配的記憶體空間的地址。
  LL->data=newdata;

  // 重置順序表的maxsize變數。
  LL->maxsize=LL->maxsize+EXTSIZE;

  return 1;
}

// 在順序表LL的第ii個位置插入元素ee,返回值:0-失敗;1-成功。
int InsertList(PSeqList LL, unsigned int ii, ElemType *ee)
{
  if ( (LL == NULL) || (ee == NULL) ) return 0;   // 檢查空指標。

  if (LL->length >= LL->maxsize)
  {
    if (ExtList(LL) == 0) { printf("護展順序表失敗。\n"); return 0; }
  }

  // 判斷插入位置是否合法
  if ( (ii < 1) || (ii > LL->length+1) )
  {
    printf("插入位置(%d)不合法,應該在(%d-%d)之間。\n",ii,1,LL->length+1); return 0;
  }

  // 注意,元素後移只能用迴圈,不能用以下注釋掉的方法,當元素是結構體時,以下方法不穩定。
  // if ( ii < LL->length+1)
  //   memcpy(LL->data+ii,LL->data+ii-1,(LL->length-ii+1)*sizeof(ElemType));

  // 把ii和ii之後的元素後移。
  int kk;
  for (kk=LL->length;kk>=ii;kk--)
  {
    memcpy(LL->data+kk,LL->data+kk-1,sizeof(ElemType));  // 採用memcpy是為了支援ee為結構體的情況。
    // memcpy(&LL->data[kk],&LL->data[kk-1],sizeof(ElemType));  // 也可以採用陣列的形式。
  }

  memcpy(LL->data+ii-1,ee,sizeof(ElemType));  // 採用memcpy是為了支援ee為結構體的情況。
  LL->length++;       // 表的長度加1。

  return 1;
}