再写顺序表(c语言实现,外加冒泡排序,二分查找)
生活随笔
收集整理的這篇文章主要介紹了
再写顺序表(c语言实现,外加冒泡排序,二分查找)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概念
順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構,一般情況下采用數組存儲。在數組 上完成數據的增刪查改。
- 順序表一般可以分為:
頭文件聲明
SeqList.h
#pragma once #include<stdbool.h>typedef int SDataType; /* //靜態順序表 typedef struct SeqList{SDataType array[100]; //能存100個數的靜態順序表int size; //表是當前順序表中有多少個數,順便也表示了即將插入的下標} SeqList; *///動態順序表 typedef struct SeqList{SDataType *array; //指上堆上的空間int size; //表是當前順序表中有多少個數,順便也表示了即將插入的下標int capacity; //容量 } SeqList;//初始化/銷毀 //seqlist 是一個變量的地址 //capacity 表示順序表的容量 void SeqListInit(SeqList * seqlist,int capacity); void SeqListDestroy(SeqList * seqlist);//增刪改查//插入 (前,中,后) //尾插 void SeqListPushBack(SeqList *seqlist, SDataType value); //頭插 void SeqListPushFront(SeqList * seqlist, SDataType value); //中間插入 void SeqListInsert(SeqList *seqlsit, int pos, SDataType value);//刪除 //尾刪 void SeqListPopBack(SeqList *seqlist); //頭刪 void SeqListPopFront(SeqList *seqlist); //刪除pos所在的下標的數據 void SeqListErase(SeqList *seqlist, int pos);//打印 void SeqListPrint(const SeqList *seqlist); //修改pos所在下標的數據為value void SeqListModify(SeqList *seqlist, int pos, SDataType value); //查找 int SeqListFind(const SeqList *seqlist, SDataType value); //找到并刪除遇到的第一個value void SeqListRemove(SeqList *seqlist, SDataType value); //判斷順序表是否為空 bool SeqListEmpty(const SeqList *seqlist); //返回數據個數 int SeqListSize(const SeqList *seqlist);//冒泡排序 void SeqListBubbleSort(SeqList *seqlist); //二分查找 int SeqListSort(const SeqList *seqlist, SDataType value); //刪除遇到的所有value void SeqListRemoveAll(SeqList *seqlist, SDataType value);順序表主要功能實現
SeqList.c
#include"SeqList.h" #include<assert.h> #include<malloc.h> #include<stdio.h> #include<stdlib.h>//檢查是否需要擴容,如果需要擴容就進行擴容 //保證函數結束后,容量一定夠用 static void CheckCapacity(SeqList *seqlist) {assert(seqlist != NULL);assert(seqlist->array != NULL);assert(seqlist->size <= seqlist->capacity);if (seqlist->size < seqlist->capacity){return;}//空間擴大兩倍int capacity = 2 * seqlist->capacity;//申請新空間SDataType *array = (SDataType *)malloc(sizeof(SDataType)*capacity);assert(array);//搬移for (int i = 0; i < seqlist->size; i++){array[i] = seqlist->array[i];}//釋放原空間free(seqlist->array);seqlist->array = array; }void SeqListInit(SeqList * seqlist, int capacity) {assert(seqlist != NULL);seqlist->array = (SDataType*)malloc(sizeof(SDataType)* capacity);assert(seqlist->array);seqlist->size = 0;seqlist->capacity = capacity; }void SeqListDestroy(SeqList * seqlist) {assert(seqlist != NULL);assert(seqlist->array != NULL);free(seqlist->array);seqlist->array = NULL;seqlist->size = 0;seqlist->capacity = 0; } //尾插 void SeqListPushBack(SeqList *seqlist, SDataType value) {assert(seqlist != NULL);assert(seqlist->array !=NULL);CheckCapacity(seqlist);seqlist->array[seqlist->size] = value;seqlist->size++; } //尾刪 void SeqListPopBack(SeqList *seqlist) {assert(seqlist != NULL);assert(seqlist->array != NULL);assert(seqlist->size > 0); //數據元素個數大于0seqlist->size--; } //頭插 /*1. 從后往前搬,避免覆蓋2. 寫循環先確定循環的邊界i 空間下表 [size,0)i 數據下標 [size -1,0]3. 搬移空間下標:array[i] = array[i-1];數據下標:array[i+1] = array[i]; */ void SeqListPushFront(SeqList * seqlist, SDataType value) {assert(seqlist != NULL);assert(seqlist->array != NULL);CheckCapacity(seqlist);//做數據的搬移,i代表空間下標for (int i = seqlist->size; i > 0; i--){seqlist->array[i] = seqlist->array[i - 1];}seqlist->array[0] = value;seqlist->size++; } //前刪 void SeqListPopFront(SeqList *seqlist){assert(seqlist != NULL);assert(seqlist->array != NULL);assert(seqlist->size > 0);#if 0for (int i = 0; i < seqlist->size; i++){seqlist->array[i] = seqlist->array[i + 1];} #endiffor (int i = 1; i < seqlist->size; i++){seqlist->array[i - 1] = seqlist->array[i];}seqlist->size--; }//中間插 void SeqListInsert(SeqList *seqlist, int pos, SDataType value){assert(seqlist != NULL);assert(seqlist->array != NULL);assert(pos >= 0 && pos <= seqlist->size);CheckCapacity(seqlist);for (int i = seqlist->size - 1; i >= pos; i--){seqlist->array[i + 1] = seqlist->array[i];}seqlist->array[pos] = value; }//中間刪 void SeqListErase(SeqList *seqlist, int pos){assert(seqlist!= NULL);assert(seqlist->array != NULL);assert(seqlist->size > 0);assert(pos >= 0 && pos < seqlist->size); #if 0//i代表數據for (int i = pos; i < seqlist->size - 1; i++){seqlist->array[i] = seqlist->array[i + 1];} #endif//i代表數據for (int i = pos + 1; i < seqlist->size ; i++){seqlist->array[i - 1] = seqlist->array[i];}seqlist->size--; }//打印 void SeqListPrint(const SeqList *seqlist){for (int i = 0; i < seqlist->size; i++)printf("%d", seqlist->array[i]);printf("\n"); } //修改pos所在下標的數據為value void SeqListModify(SeqList *seqlist, int pos, SDataType value){assert(pos >= 0 && pos < seqlist->size);seqlist->array[pos] = value; } //查找 //找到返回下標 //沒找到返回-1 int SeqListFind(const SeqList *seqlist, SDataType value){for (int i = 0; i < seqlist->size; i++){if (seqlist->array[i] == value){return i;}}return -1; } //找到并刪除遇到的第一個value void SeqListRemove(SeqList *seqlist, SDataType value){int pos = SeqListFind(seqlist, value);if (pos != -1){SeqListErase(seqlist, pos);} } //判斷順序表是否為空 bool SeqListEmpty(const SeqList *seqlist){return seqlist->size == 0; } //返回數據個數 int SeqListSize(const SeqList *seqlist){return seqlist->size; }void Swap(int *a, int *b) {int t = *a;*a = *b;*b = t; }//冒泡排序 void BubbleSort(int array[], int size) {int isSorted; //如果數組本身有序,就可以優化for (int i = 0; i < size - 1; i++){isSorted = 1; //1代表有序//一次冒泡過程//一次冒泡過程中,如果沒有交換就說明本身有序for (int j = 0; j < size - 1 - i; j++){if (array[j]>array[j + 1]){Swap(array + j, array + j + 1);//Swap(&array[i])isSorted = 0;}}//一次冒泡結束if (isSorted == 1){break;}} }//冒泡排序 void SeqListBubbleSort(SeqList *seqlist){BubbleSort(seqlist->array, seqlist->size); }//二分查找 int SeqListSort(const SeqList *seqlist, SDataType value) {int left = 0;int right = seqlist->size;while (left < right){int mid = (right - left) / 2 + left;if (value == seqlist->array[mid]){return mid;}else if (value < seqlist->array[mid]){right = mid;}else{left = mid + 1;}}return -1; }void SeqListRemoveAll(SeqList *seqlist, SDataType value){ #if 0 //O(N*2) O(1)int pos;while ((pos = SeqListFind(seqlist, value)) != -1){SeqListErase(seqlist, pos);} #endif#if 0 //O(N) O(N)//開辟新數組SDataType *array = (SDataType *)malloc(sizeof(SDataType)* seqlist->size);assert(array);//搬出去int index = 0;for (int i = 0; i < seqlist->size; i++){if (seqlist->array[i] != value){array[index] = seqlist->array[i];index++;}}//搬回去for (int j = 0; j < index; j++){seqlist->array[j] = array[j];}seqlist->size = index; #endifint index = 0;for (int i = 0; i < seqlist->size; i++){if (seqlist->array[i] != value){seqlist->array[index] = seqlist->array[i];index++;}}seqlist->size = index; }測試用例
Main.c
#include"SeqList.h"void TestSeqList1() {SeqList seqlist;SeqListInit(&seqlist, 100);SeqListPushBack(&seqlist, 1);SeqListPushBack(&seqlist, 2);SeqListPushBack(&seqlist, 3);//1,2,3SeqListPushFront(&seqlist, 11);SeqListPushFront(&seqlist, 12);SeqListPushFront(&seqlist, 13);//13,12,11,1,100,2,3SeqListInsert(&seqlist, 4, 100);//13,12,11,1,100,2,3SeqListPopBack(&seqlist);//13,12,11,1,100,2SeqListPopFront(&seqlist);//12,11,1,100,2SeqListErase(&seqlist, 3);//12,11,100,2SeqListDestroy(&seqlist); }void TestSeqList2() {SeqList seqlist;SeqListInit(&seqlist, 10);SeqListPushBack(&seqlist, 3);SeqListPushBack(&seqlist, 5);SeqListPushBack(&seqlist, 2);SeqListPushBack(&seqlist, 7);SeqListPushBack(&seqlist, 9);SeqListPushBack(&seqlist, 4);SeqListPushBack(&seqlist, 8);SeqListPushBack(&seqlist, 6);SeqListPushBack(&seqlist, 1);SeqListPushBack(&seqlist, 0);SeqListBubbleSort(&seqlist);int r = SeqListSort(&seqlist, 3);printf("%d\n", r);SeqListPrint(&seqlist); }int main() {TestSeqList2();system("pause");return 0; }總結
以上是生活随笔為你收集整理的再写顺序表(c语言实现,外加冒泡排序,二分查找)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dnf50级战法想收集一套流光套可拍卖场
- 下一篇: 英雄联盟手游怎么点赞