基礎資料結構(一)---(最全)定長順序表的實現

Building_Y_D發表於2020-11-11

定長順序表的實現

定義

順序表:是在計算機記憶體中以陣列的形式儲存的線性表,是指用一組地址連續的儲存單元依次儲存資料元素的線性結構。線性表採用順序儲存的方式儲存就稱之為順序表。順序表是將表中的結點依次存放在計算機記憶體中一組地址連續的儲存單元中。
儲存結構:
儲存的資料但在邏輯上是連續的,在儲存 的物理空間上是不連續的。每個資料都有一個直接前驅和後繼(除了第一個和最後一個)
定長順序表:
儲存的資料在邏輯上是連續的,在儲存的物理空間上也是連續的。類似於陣列
圖例如下

在這裡插入圖片描述

功能的實現

1、初始化
2、插入
3、頭插
4、尾插
5、按位置刪除
6、頭刪
7、尾刪
8、按值刪除
9、按值查詢
10、銷燬

結構體

#define INITSIZE 100
typedef int ElemType;
typedef struct
{
 ElemType* data;//data用來儲存申請的空間的首地址
 int       length;//當前已儲存的資料元素的個數
 int       size;//記錄當前空間的大小
}SqList;

初始化

void InitSqList(SqList* sq)
{
 if (sq == NULL) exit(0);
 sq->data = (ElemType*)malloc(sizeof(ElemType) * INITSIZE);
 if (sq->data == NULL) exit(0);
 sq->length = 0;
 sq ->size = INITSIZE;
}

插入

void InsertSqList(SqList *sq, ElemType val, int pos)
{
 if (sq == NULL) exit(0);
 if (pos<0 || pos>sq->length)
 {
  printf("Insert:: pos is error\n");
  return;
 }
 if (sq->length == sq->size)
 {
  if (-1 == AppendSpqce(sq))
  {
   printf("Insert::AppendSpace fail\n");
   return;
  }
 }
 for (int i = sq->length; i > pos; --i)
 {
  sq->data[i] = sq->data[i - 1];
 }
 sq->data[pos] = val;
 sq->length++;
}

頭插

void InsertSqListHead(SqList *sq,ElemType val,int pos)
{
 InsertSqList(sq, val, 0);
}

尾插

void InsertSqListTail(SqList *sq , ElemType val)
{
 if (sq == NULL) exit(0);
 InsertSqList(sq, val, sq->length);
}

按位置刪除

void SqListDeletePos(SqList *sq, int pos)
{
 if (sq == NULL) exit(0);
 if (pos<0 || pos>sq->length)
 {
  printf("Delete:: pos is error\n");
  return;
 }
 for (int i = pos; i < sq->length - 1; i++)
 {
  sq->data[i] = sq->data[i + 1];
 }
 sq->length--;
}

頭刪

void SqListDeleteHead(SqList *sq)
{
 SqListDeletePos(sq, 0);
}

尾刪

void SqListDeleteTail(SqList *sq)
{
 if (sq == NULL) exit(0);
 if (sq->length == 0) return;
 sq->length--;
}

按值刪除

void SqListDeleteValue(SqList *sq, ElemType val)
{
 if (sq == NULL) exit(0);
 int count = 0;
 for (int i = 0; i + count < sq->length;)
 {
  if (val == sq->data[i])
  {
   count++;
  }
  else
  {
   i++;
  }
  sq->data[i] = sq->data[i + count];
 }
 sq->length -= count;
}

按值查詢

int FindValueLast(SqList *sq, ElemType val)
{
 if (sq == NULL) exit(0);
 int index = -1;
 for (int i = 0; i < sq->length; ++ i)
 {
  if (sq->data[i] == val)
  {
   index -1;
  }
 }
 return index;
}

銷燬

void SqListDestroy(SqList *sq)
{
 if (sq == NULL) exit(0);
 free(sq->data);
 sq->data == NULL;//防止出現野指標
 sq->length = 0;
}

此文章僅代表自己(本菜鳥)學習積累記錄,或者學習筆記,如有侵權,請聯絡作者刪除。人無完人,文章也一樣,文筆稚嫩,在下不才,勿噴,如果有錯誤之處,還望指出,感激不盡~
技術之路不在一時,山高水長,縱使緩慢,馳而不息。

相關文章