數據結構順序表實現學習

#include"SeqList.h"



void InitSeqList(SeqList *list)//初始化順序表
{
list->base = (Elemtype *)malloc(sizeof(Elemtype) * SEQLIST_INIT_SIZE);
assert(list->base != NULL);//用assert進行檢測,檢查是否創建成功
list->capacity = SEQLIST_INIT_SIZE;//初始化容量
list->size = 0;//初始化當前位置
}


void push_back(SeqList *list, Elemtype x)// 1. 尾插實現
{
if (list->size >= list->capacity)
{
printf("順序表已滿,無法進行尾插!\n");
return;
}
list->base[list->size] = x;
list->size++;
}


void push_front(SeqList *list, Elemtype x)// 2. 頭插實現
{
if (list->size >= list->capacity)
{
printf("順序表已滿,不能進行頭插!\n");
return;
}
for (int i = list->size; i > 0; --i)
{
list->base[i] = list->base[i - 1];
}
list->base[0] = x;
list->size++;
}


void show_list(SeqList *list)// 3. 顯示實現
{
for (int i = 0; i < list->size; ++i)
{
printf("%d ", list->base[i]);
}
printf("\n");
}


void pop_back(SeqList *list)// 4.尾部刪除實現
{
if (list->size == 0)
{
printf("線性表已空,不能尾部刪除!\n");
return;
}
list->size--;
}


void pop_front(SeqList *list)// 5. 頭部刪除
{
if (list->size == 0)
{
printf("順序表已空,不能進行頭刪!\n");
return;
}
for (int i = 0; i < list->size - 1; i++)
{
list->base[i] = list->base[i + 1];
}
list->size--;
}


void insert_pos(SeqList *list, int pos, Elemtype x)// 6. 按位置插入的函數實現
{
if (pos < 0 || pos > list->size)
{
printf("位置非法,不能進行按位置插入.\n");
return;
}
for (int i = list->size; i > pos; --i)
{
list->base[i] = list->base[i - 1];
}
list->base[pos] = x;
list->size++;
}


int find(SeqList *list, Elemtype key)// 7.對順序表中的數據進行查找
{
for (int i = 0; i < list->size; i++)
{
if (list->base[i] == key)
{
return i;
}
}
return -1;
}


int length(SeqList *list)// 8. 求順序表的長度
{
return list->size;
}


void delete_pos(SeqList *list, int pos)// 9. 按位置進行刪除
{
if (pos < 0 || pos > list->size)
{
printf("輸入的位置非法,不能進行刪除.\n");
return;
}
for (int i = pos; i < list->size - 1; i++)
{
list->base[i] = list->base[i + 1];
}
list->size--;
}


//此處刪除利用到了前面所寫的函數,首先查找要刪除的數據在表中的位置,接着一個按位置刪除的函數進行刪除
void delete_val(SeqList *list, Elemtype x)// 10. 按值進行刪除
{
int pos = find(list, x);//此處找到位置
if (pos == -1)
{
printf("順序表中不存在要刪除的數據.\n");
return;
}
delete_pos(list, pos);//若存在要刪除的數據,則調用按位置刪除的函數
}


void sort(SeqList *list)// 11. 排序
{
for (int i = 0; i < list->size; i++)
{
for (int j = 0; j < list->size - i - 1; ++j)
{
if (list->base[j] > list->base[j + 1])
{
Elemtype temp = list->base[j];
list->base[j] = list->base[j + 1];
list->base[j + 1] = temp;
}
}
}
}
//在這個逆置之中用到了一箇中間變量,當然也可以重新申請一個空間用來進行交換,但是當數據特多的時候就是不好的了,所以可行不可取!
void inverse(SeqList *list)// 12. 逆置
{
if (list->size == 0 || list->size == 1)
return;
Elemtype low = 0, high = list->size - 1;
while (low < high)
{
Elemtype temp;
temp = list->base[low];
list->base[low] = list->base[high];
list->base[high] = temp;
low++;
high--;
}
}
//清除和摧毀是有區別的,清除是表的 size 變成0; 摧毀是將整個表摧毀,清除之後還可以繼續插入數據,摧毀之後就不可以插入了;
void clear(SeqList *list)// 13. 清除
{
list->size = 0;
}


void destroy(SeqList *list)// 14. 摧毀順序表
{
free(list->base);
list->capacity = 0;
list->size = 0;

}

**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************


#include"SeqList.h"


void InitSeqList(SeqList *list)//初始化順序表
{
list->base = (Elemtype *)malloc(sizeof(Elemtype) * SEQLIST_INIT_SIZE);
assert(list->base != NULL);//用assert進行檢測,檢查是否創建成功
list->capacity = SEQLIST_INIT_SIZE;//初始化容量
list->size = 0;//初始化當前位置
}


void push_back(SeqList *list, Elemtype x)// 1. 尾插實現
{
if (list->size >= list->capacity)
{
printf("順序表已滿,無法進行尾插!\n");
return;
}
list->base[list->size] = x;
list->size++;
}


void push_front(SeqList *list, Elemtype x)// 2. 頭插實現
{
if (list->size >= list->capacity)
{
printf("順序表已滿,不能進行頭插!\n");
return;
}
for (int i = list->size; i > 0; --i)
{
list->base[i] = list->base[i - 1];
}
list->base[0] = x;
list->size++;
}


void show_list(SeqList *list)// 3. 顯示實現
{
for (int i = 0; i < list->size; ++i)
{
printf("%d ", list->base[i]);
}
printf("\n");
}


void pop_back(SeqList *list)// 4.尾部刪除實現
{
if (list->size == 0)
{
printf("線性表已空,不能尾部刪除!\n");
return;
}
list->size--;
}


void pop_front(SeqList *list)// 5. 頭部刪除
{
if (list->size == 0)
{
printf("順序表已空,不能進行頭刪!\n");
return;
}
for (int i = 0; i < list->size - 1; i++)
{
list->base[i] = list->base[i + 1];
}
list->size--;
}


void insert_pos(SeqList *list, int pos, Elemtype x)// 6. 按位置插入的函數實現
{
if (pos < 0 || pos > list->size)
{
printf("位置非法,不能進行按位置插入.\n");
return;
}
for (int i = list->size; i > pos; --i)
{
list->base[i] = list->base[i - 1];
}
list->base[pos] = x;
list->size++;
}


int find(SeqList *list, Elemtype key)// 7.對順序表中的數據進行查找
{
for (int i = 0; i < list->size; i++)
{
if (list->base[i] == key)
{
return i;
}
}
return -1;
}


int length(SeqList *list)// 8. 求順序表的長度
{
return list->size;
}


void delete_pos(SeqList *list, int pos)// 9. 按位置進行刪除
{
if (pos < 0 || pos > list->size)
{
printf("輸入的位置非法,不能進行刪除.\n");
return;
}
for (int i = pos; i < list->size - 1; i++)
{
list->base[i] = list->base[i + 1];
}
list->size--;
}


//此處刪除利用到了前面所寫的函數,首先查找要刪除的數據在表中的位置,接着一個按位置刪除的函數進行刪除
void delete_val(SeqList *list, Elemtype x)// 10. 按值進行刪除
{
int pos = find(list, x);//此處找到位置
if (pos == -1)
{
printf("順序表中不存在要刪除的數據.\n");
return;
}
delete_pos(list, pos);//若存在要刪除的數據,則調用按位置刪除的函數
}


void sort(SeqList *list)// 11. 排序
{
for (int i = 0; i < list->size; i++)
{
for (int j = 0; j < list->size - i - 1; ++j)
{
if (list->base[j] > list->base[j + 1])
{
Elemtype temp = list->base[j];
list->base[j] = list->base[j + 1];
list->base[j + 1] = temp;
}
}
}
}
//在這個逆置之中用到了一箇中間變量,當然也可以重新申請一個空間用來進行交換,但是當數據特多的時候就是不好的了,所以可行不可取!
void inverse(SeqList *list)// 12. 逆置
{
if (list->size == 0 || list->size == 1)
return;
Elemtype low = 0, high = list->size - 1;
while (low < high)
{
Elemtype temp;
temp = list->base[low];
list->base[low] = list->base[high];
list->base[high] = temp;
low++;
high--;
}
}
//清除和摧毀是有區別的,清除是表的 size 變成0; 摧毀是將整個表摧毀,清除之後還可以繼續插入數據,摧毀之後就不可以插入了;
void clear(SeqList *list)// 13. 清除
{
list->size = 0;
}


void destroy(SeqList *list)// 14. 摧毀順序表
{
free(list->base);
list->capacity = 0;
list->size = 0;
}


**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************


#include<stdio.h>
#include"SeqList.h"


void main()
{
SeqList mylist;
InitSeqList(&mylist);
Elemtype Item;//待操作元素
int select = 1;//選項
int pos;//位置
while (select)
{
printf("**************************************************************\n");
printf("* [1]  push_back  尾插           [2]  push_front  頭插       *\n");
printf("* [3]  show_list  顯示           [4]  pop_back    尾刪       *\n");
printf("* [5]  pop_front  頭刪           [6]  insert_pos  按位置插入 *\n");
printf("* [7]  find       查找           [8]  length      求表長     *\n");
printf("* [9]  delete_pos 按位刪除       [10] delete_val  按值刪除   *\n");
printf("* [11] sort       排序           [12] inverse     逆置       *\n");
printf("* [13] clear      清除           [14] destroy     摧毀       *\n");
printf("* [0]  quit_system退出                                       *\n");
printf("**************************************************************\n");
printf("請選擇: >");
scanf_s("%d", &select);
if (select == 0)
break;
switch (select)
{
case 1:
//尾插
printf("請輸入要插入的數據(-1結束).>");
while (scanf_s("%d", &Item), Item != -1)//while循環可以實現多個數據的輸入,並且此處有個逗號表達式值得注意
{
push_back(&mylist, Item);
}
break;
case 2:
//頭插
printf("請輸入要插入的數據(-1結束).>");
while (scanf_s("%d", &Item), Item != -1)//while循環可以實現多個數據的輸入,並且此處有個逗號表達式值得注意
{
push_front(&mylist, Item);
}
break;
case 3:
//顯示順序表
show_list(&mylist);
break;
case 4:
pop_back(&mylist);//尾部刪除
break;
case 5:
pop_front(&mylist);//頭部刪除
break;
case 6:
printf("請輸入要插入的數據:>");
scanf_s("%d", &Item);
printf("請輸入插入的位置:>");
scanf_s("%d", &pos);
insert_pos(&mylist, pos, Item);//按位置插入
break;
case 7:
printf("請輸入需要查找的數據:>");
scanf_s("%d", &Item);
pos = find(&mylist, Item);//查找數據在順序表中的位置
if (pos == -1)
{
printf("%d在順序表中不存在.\n", Item);
}
else
{
printf("順序表中%d在下標爲%d的位置.\n", Item, pos);
}
break;
case 8:
printf("順序表的長度爲%d.\n", length(&mylist));
break;
case 9:
printf("請輸入需要刪除數據的位置.>");
scanf_s("%d", &pos);
delete_pos(&mylist, pos);
break;
case 10:
printf("請輸入要刪除的數據.>");
scanf_s("%d", &Item);
delete_val(&mylist, Item);
break;
case 11:
sort(&mylist);
break;
case 12:
inverse(&mylist);
break;
case 13:
clear(&mylist);
break;
case 14:
destroy(&mylist);
break;
default:
printf("輸入的信息有錯誤,請重新輸入.\n");
break;
}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章