資料結構:實現動態順序表的各項介面(初始化,銷燬,尾插尾刪,頭插頭刪,刪除,排序,查詢等)
阿新 • • 發佈:2018-12-19
實現動態順序表
SeqList.h
#pragma once ////靜態順序表 //#define N 10 //typedef int SLDateType; //typedef struct SeqList //{ // int _a[N];//陣列 // size_t _size;//有多少個有效資料 //}SeqList; // #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <malloc.h> //動態順序表 #define N 10 typedef int SLDateType; typedef struct SeqList { SLDateType* _a; //陣列 size_t _size; //有多少個有效資料 size_t _capacity; //容量 }SeqList; void CheckCapacity(SeqList* psl); void SeqListInit(SeqList* psl, size_t capacity);//初始化 void SeqListDestory(SeqList* psl);//銷燬 void SeqListPushBack(SeqList* psl, SLDateType x);//尾插 void SeqListPopBack(SeqList* psl);//尾刪 void SeqListPushFront(SeqList* psl, SLDateType x);//頭插 void SeqListPopFront(SeqList* psl);//頭刪 void SeqListInsert(SeqList* psl, size_t pos, SLDateType x);//任意位置的插入,在pos位置上的插入 void SeqListErase(SeqList* psl, size_t pos);//刪除pos這個位置的資料 void SeqListRemove(SeqList* psl, SLDateType x);//刪除x這個資料 int SeqListFind(SeqList* psl, SLDateType x);//查詢一個數據 void SeqListModify(SeqList* psl, size_t pos, SLDateType x);//修改pos位置的值,修改為x void SeqListPrint(SeqList* psl);//列印該順序表 void SeqListBubbleSort(SeqList* psl);//氣泡排序 void SeqListSelectSort(SeqList* psl);//選擇排序 int SeqListBinarySearch(SeqList* psl,SLDateType x); //二分查詢 void SeqListRemoveAll(SeqList* psl,SLDateType x);//刪除所有的x void TestSeqList();//測試函式
SeqList.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "SeqList.h" void CheckCapacity(SeqList* psl)//檢查容量 { assert(psl); if (psl->_capacity == psl->_size) { if (psl->_capacity == 0) { psl->_capacity = 2; } SLDateType* tmp = realloc(psl->_a, psl->_capacity * 2 * sizeof(SLDateType));//增二倍 assert(tmp); psl->_a = tmp; psl->_capacity *= 2; } } void SeqListPrint(SeqList* psl)//順序表的列印 { assert(psl); size_t i = 0; for (i = 0; i < (psl->_size); i++) { printf("%d ", psl->_a[i]); } printf("\n"); } void SeqListInit(SeqList* psl, size_t capacity)//初始化 { assert(psl); if (capacity == 0) { psl->_capacity = 0; psl->_size = 0; psl->_a = NULL; } else { psl->_a = (SLDateType*)malloc(sizeof(SLDateType)*capacity); assert(psl->_a); psl->_capacity = capacity; psl->_size = 0; } } void SeqListDestory(SeqList* psl)//銷燬順序表 { assert(psl); free(psl->_a); psl->_a = NULL; psl->_capacity = 0; psl->_size = 0; } void SeqListPushBack(SeqList* psl, SLDateType x)//尾插 { assert(psl); CheckCapacity(psl); psl->_a[psl->_size] = x; psl->_size++; //SeqListInsert(psl, psl->_size, x); } void SeqListPopBack(SeqList* psl)//尾刪 { assert(psl); if (psl->_size > 0) { psl->_size--; } //SeqListErase(psl, psl->_size); } void SeqListPushFront(SeqList* psl, SLDateType x)//頭插 { assert(psl); CheckCapacity(psl); int end = psl->_size; while (end >= 0) { psl->_a[end + 1] = psl->_a[end]; end--; } psl->_a[0] = x; psl->_size++; //SeqListInsert(psl, 0, x); } void SeqListPopFront(SeqList* psl)//頭刪 { assert(psl); if ((psl->_size) > 0) { int start = 0; while (start < (int)(psl->_size-1)) { psl->_a[start] = psl->_a[start + 1]; start++; } psl->_size--; } //SeqListErase(psl, 0); } void SeqListInsert(SeqList* psl, size_t pos, SLDateType x)//任意位置的插入,在pos位置上的插入 { assert(psl && pos <= (psl->_size));//pos=size可以理解為尾插 int end = psl->_size - 1; CheckCapacity(psl); while (end >= (int)pos) { psl->_a[end + 1] = psl->_a[end]; end--; } psl->_a[pos] = x; psl->_size++; } void SeqListErase(SeqList* psl, size_t pos)//刪除pos這個位置的資料 { assert(psl && pos <= (psl->_size)); int start = pos; while (start < (int)(psl->_size - 1)) { psl->_a[start] = psl->_a[start + 1]; start++; } psl->_size--; } int SeqListFind(SeqList* psl, SLDateType x)//查詢一個數據 { assert(psl); size_t i = 0; for (i = 0; i < (psl->_size); i++) { if (psl->_a[i] == x) { return i; } } return -1; } void SeqListRemove(SeqList* psl, SLDateType x)//刪除x這個資料 { assert(psl); int pos = SeqListFind(psl, x); if (pos != -1) { SeqListErase(psl, pos); } } void SeqListModify(SeqList* psl, size_t pos, SLDateType x)//修改pos位置的值,修改為x { assert(psl && pos<(psl->_size)); psl->_a[pos] = x; } void SeqListBubbleSort(SeqList* psl)//氣泡排序 { assert(psl); size_t i = 0; size_t j = 0; int flag = 0; for (i = 0; i < psl->_size - 1; i++) { flag = 0; for (j = 0; j < psl->_size - 1 - i; j++) { if (psl->_a[j] > psl->_a[j + 1]) { SLDateType tmp = psl->_a[j]; psl->_a[j] = psl->_a[j + 1]; psl->_a[j + 1] = tmp; flag = 1; } } if (flag = 0) { break; } } } void Swap(SLDateType* x, SLDateType* y)//交換函式 { int tmp = *x; *x = *y; *y = tmp; } void SeqListSelectSort(SeqList* psl)//選擇排序 { assert(psl); int begin = 0; int end = psl->_size - 1; while (begin < end) { int min = begin; int max = begin; for (int i = begin; i < end; i++) { if (psl->_a[i] < psl->_a[min]) { min = i; } if (psl->_a[i] > psl->_a[max]) { max = i; } } Swap(&psl->_a[begin], &psl->_a[min]); if (begin == max) { max = min; } Swap(&psl->_a[end], &psl->_a[max]); begin++; end--; } } int SeqListBinarySearch(SeqList* psl,SLDateType x) //二分查詢 { assert(psl); size_t left = 0; size_t right = psl->_size - 1; while (left <= right) { int mid = left + (right - left) / 2; if (psl->_a[mid] == x) { return mid; } if (psl->_a[mid] > x) { right = mid - 1; } if (psl->_a[mid] < x) { left = mid + 1; } } return -1; } void SeqListRemoveAll(SeqList* psl, SLDateType x)//刪除所有的x { assert(psl); size_t i = 0; while (i < psl->_size-1) { int cur = SeqListFind(psl, x); if (cur != -1) { SeqListRemove(psl, x); } i++; } } void TestSeqList()//測試 { SeqList sl; SeqListInit(&sl, 5); SeqListPushBack(&sl, 1);//尾插1 SeqListPushBack(&sl, 2); SeqListPushBack(&sl, 3); SeqListPushBack(&sl, 3); SeqListPushBack(&sl, 3); SeqListPushBack(&sl, 3); SeqListPushBack(&sl, 4); SeqListPushBack(&sl, 5); SeqListPushBack(&sl, 6); SeqListPushBack(&sl, 7); SeqListPopBack(&sl);//尾刪 SeqListPrint(&sl); SeqListPushFront(&sl, 50);//頭插50 SeqListPushFront(&sl, 50); SeqListPopFront(&sl);//頭刪 SeqListPrint(&sl); SeqListInsert(&sl, 4, 100);//在下標為4的資料前新增資料100 SeqListPrint(&sl); SeqListErase(&sl, 6);//刪除下標為6的資料 SeqListPrint(&sl); SeqListRemove(&sl, 2);//刪除2 SeqListPrint(&sl); SeqListModify(&sl, 3, 2); SeqListPrint(&sl); //SeqListBubbleSort(&sl);//氣泡排序 SeqListSelectSort(&sl);//選擇排序 SeqListPrint(&sl); int sub = SeqListBinarySearch(&sl, 2);//二分查詢資料2 if (sub != -1) { printf("找到了,下標為:%d\n", sub); } SeqListRemoveAll(&sl, 3);//刪除所有3 SeqListPrint(&sl); SeqListDestory(&sl);//銷燬該順序表 }
Main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
int main()
{
TestSeqList();
system("pause");
return 0;
}