【数据结构】顺序表的实现

来源:互联网 发布:泛泰主义知乎 编辑:程序博客网 时间:2024/05/29 17:46
seq_list.h
#pragma once#include<stdio.h>#include<stddef.h>#define LIST_SIZE_INIT 3#define default_value 1000typedef char SeqType;typedef struct Seqlist{SeqType* data;size_t size;size_t capacity;}Seqlist;void Seqlist_init(Seqlist *seq);void Seqlist_pushBack(Seqlist* seq, SeqType value);void printf_seqlist(Seqlist* seq);void Seqlist_popBack(Seqlist* seq);void Seqlist_pushFront(Seqlist* seq, SeqType value);void Seqlist_popFront(Seqlist* seq);SeqType Seqlist_get(Seqlist* seq, size_t pos);void Seqlist_Set(Seqlist* seq, size_t pos, SeqType value);size_t Seqlist_Find(Seqlist* seq, SeqType value);void Seqlist_Insert(Seqlist* seq, size_t pos, SeqType value);void Seqlist_Erase(Seqlist* seq, size_t pos);void Seqlist_Remove(Seqlist* seq, SeqType value);void Seqlist_Remove_all(Seqlist* seq, SeqType delete_value);size_t Seqlist_size(Seqlist* seq);int SeqlistEmpty(Seqlist* seq);void SeqListBubbleSort(Seqlist* seq);void SeqListBubbleSortEx(SeqList* seq, int(*cmp)(SType, SType));

seqlist.c
#define _CRT_SECURE_NO_WARNINGS 1#include"seq_list.h"//初始化顺序表void Seqlist_init(Seqlist *seq){if (seq == NULL){printf("seq指针为空指针");return;}seq->capacity = LIST_SIZE_INIT;seq->data = (SeqType *)malloc(seq->capacity * sizeof(SeqType));if (seq->data != NULL){seq->size = 0;}}//判断顺序表是不是已满,如果满了,则扩充void Seqlist_if_full(Seqlist* seq){if (seq == NULL){printf("seq指针为空指针");return;}if (seq->size == LIST_SIZE_INIT){SeqType* new_data = (SeqType*)realloc(seq->data, sizeof(SeqType)*seq->capacity * 2);if (new_data != NULL){seq->data = new_data;seq->capacity *= 2;}}}//尾插一个元素void Seqlist_pushback(Seqlist* seq, SeqType value){if (seq == NULL){printf("seq指针为空指针");return;}Seqlist_if_full(seq);size_t i = seq->size++;seq->data[i] = value;}//删除顺序表尾部的最后一个元素void Seqlist_Popback(Seqlist* seq){if (seq == NULL){printf("seq指针为空指针");return;}seq->size -= 1;}//往顺序表的前面插入一个元素 void Seqlist_pushFront(Seqlist* seq, SeqType value){if (seq == NULL){printf("seq指针为空指针");return;}Seqlist_if_full(seq);size_t i = seq->size;seq->size++;for (; i > 0; i--){seq->data[i + 1] = seq->data[i];}seq->data[1] = seq->data[0];seq->data[0] = value;}//删除顺序表的第一个元素 void Seqlist_popFront(Seqlist* seq){if (seq == NULL){printf("seq指针为空指针");return;}size_t i = 0;for (; i < seq->size - 1; i++){seq->data[i] = seq->data[i + 1];}seq->size--;}//取顺序表中任意位置的一个元素 SeqType Seqlist_get(Seqlist* seq, size_t pos){if (seq == NULL){printf("seq指针为空指针");return;}if (pos >= seq->size){return default_value;}else{return seq->data[pos];}}//将顺序表中指定位置的值进行设置 void Seqlist_Set(Seqlist* seq, size_t pos, SeqType value){if (seq == NULL){printf("seq指针为空指针");return;}if (pos >= seq->size){return default_value;}seq->data[pos] = value;}//查找顺序表中指定元素的下标 size_t Seqlist_Find(Seqlist* seq, SeqType value){if (seq == NULL){printf("seq指针为空指针");return;}size_t i = 0;for (; i < seq->size; i++){if (seq->data[i] == value){return i;}}return  -1;}//在指定位置插入元素 void Seqlist_Insert(Seqlist* seq, size_t pos, SeqType value){if (seq == NULL){printf("seq指针为空指针");return;}Seqlist_if_full(seq);size_t i = seq->size;seq->size++;for (; i > pos; i--){seq->data[i + 1] = seq->data[i];}seq->data[pos + 1] = seq->data[pos];seq->data[pos] = value;}// 删除指定位置的元素 void Seqlist_Erase(Seqlist* seq, size_t pos){if (seq == NULL){printf("seq指针为空指针");return;}size_t i = 0;size_t j = seq->size - pos -1;for (; i < j; i++){seq->data[pos+i] = seq->data[pos + i+1];}seq->size--;}//删除顺序表中指定的值, 如果存在重复元素, 只删除第一个 void Seqlist_Remove(Seqlist* seq, SeqType value){if (seq == NULL){printf("seq指针为空指针");return;}size_t m = 0;for (; m < seq->size; m++){if (seq->data[m] == value){size_t i = 0;size_t j = seq->size - m - 1;for (; i < j; i++){seq->data[m + i] = seq->data[m + i + 1];}seq->size--;break;}}}//删除顺序表中所有指定的值O(n^2)void Seqlist_Remove_all(Seqlist* seq, SeqType delete_value){if (seq == NULL){printf("seq指针为空指针");return;}size_t m = 0;for (; m < seq->size; m++){if (seq->data[m] == delete_value){size_t i = 0;size_t j = seq->size - m - 1;for (; i < j; i++){seq->data[m + i] = seq->data[m + i + 1];}seq->size--;m = 0;}}}//获取顺序表元素个数size_t Seqlist_size(Seqlist* seq){if (seq == NULL){printf("seq指针为空指针");return;}return seq->size;}//判断顺序表是否为空int SeqlistEmpty(Seqlist* seq){if(seq == NULL){printf("seq指针为空指针");return;}if (seq->size == 0){return 1;}else{return 0;}}//冒泡排序void SeqListBubbleSort(Seqlist* seq){if (seq == NULL){printf("seq指针为空指针");return;}size_t i = 0;size_t j = 0;for ( i = 0; i < seq->size; i++){for (j = 0; j < seq->size - 1 - i; j++){if (seq->data[j + 1]<seq->data[j]){SeqType tmp = seq->data[j];seq->data[j] = seq->data[j + 1];seq->data[j + 1] = tmp;}}}}//打印顺序表void printf_seqlist(Seqlist* seq){if (seq == NULL){printf("seq指针为空指针");return;}size_t i = 0;for (i = 0; i < seq->size; i++){printf("%c  ",seq->data[i]);}printf("\n");}
test.c
#define _CRT_SECURE_NO_WARNINGS 1#include"seq_list.h"#include<stdio.h>#include<stdlib.h>void my_title(){printf("*******************TEST******************\n");}void testPushback(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'b');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'd');printf_seqlist(&seq);}void test_popback(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'b');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'd');Seqlist_Popback(&seq);printf_seqlist(&seq);Seqlist_Popback(&seq);printf_seqlist(&seq);Seqlist_Popback(&seq);printf_seqlist(&seq);}void test_push_front(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'b');Seqlist_pushFront(&seq, 'c');Seqlist_pushFront(&seq, 'd');printf_seqlist(&seq);}void test_popfront(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'b');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'd');Seqlist_popFront(&seq);Seqlist_popFront(&seq);printf_seqlist(&seq);}void test_getvalue(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'b');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'd');printf("%c\n",Seqlist_get(&seq, 0));printf("%c\n", Seqlist_get(&seq, 1));printf("%c\n", Seqlist_get(&seq, 2));printf("%c\n", Seqlist_get(&seq, 4));}void test_setvalue(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'b');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'd');Seqlist_Set(&seq, 0, 'z');Seqlist_Set(&seq, 3, 'm');printf_seqlist(&seq);}void test_seqlist_find(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'b');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'd');printf("您要查找的元素下标为:%d\n", Seqlist_Find(&seq, 'a'));printf("您要查找的元素下标为:%d\n", Seqlist_Find(&seq, 'b'));printf("您要查找的元素下标为:%d\n", Seqlist_Find(&seq, 'c'));printf("您要查找的元素下标为:%d\n", Seqlist_Find(&seq, 'e'));}void test_seqlist_insert(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'b');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'd');Seqlist_Insert(&seq, 0, 'z');Seqlist_Insert(&seq, 1, 'a');Seqlist_Insert(&seq, 2, 'z');printf_seqlist(&seq);}void test_Seqlist_erase(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'b');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'd');Seqlist_pushback(&seq, 'e');Seqlist_pushback(&seq, 'f');Seqlist_Erase(&seq, 1);printf_seqlist(&seq);Seqlist_Erase(&seq, 2);printf_seqlist(&seq);}void test_seqlist_remove(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'b');Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'd');Seqlist_pushback(&seq, 'a');Seqlist_Remove(&seq, 'a');printf_seqlist(&seq);}void test_empty_size(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'b');Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'd');Seqlist_pushback(&seq, 'a');printf("顺序表长度:%d\n", Seqlist_size(&seq));int ret = SeqlistEmpty(&seq);if (ret == 1){printf("顺序表为空\n");}else{printf("顺序表bu为空\n");}}void test_seqlist_bubbleSort(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'b');Seqlist_pushback(&seq, 'd');Seqlist_pushback(&seq, 'f');Seqlist_pushback(&seq, 'e');SeqListBubbleSort(&seq);printf_seqlist(&seq);}void test_pop_all(){Seqlist seq;my_title();Seqlist_init(&seq);Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'c');Seqlist_pushback(&seq, 'a');Seqlist_pushback(&seq, 'd');Seqlist_pushback(&seq, 's');Seqlist_pushback(&seq, 'e');Seqlist_Remove_all(&seq, 'a');printf_seqlist(&seq);}void test(){testPushback();test_popback();test_push_front();test_popfront();test_getvalue();test_setvalue();test_seqlist_find();test_seqlist_insert();test_Seqlist_erase();test_seqlist_remove();test_empty_size();test_seqlist_bubbleSort();test_pop_all();}int main(){test();system("pause");return 0;}


原创粉丝点击