【C语言】实现动态顺序表

来源:互联网 发布:重装系统 软件 编辑:程序博客网 时间:2024/05/29 04:28

     其实动态顺序表就是在静态顺序表的基础上进行修改的,动态顺序表的底层实现是一个指向动态数组;我们根据存储数据的个数,在原开辟内存的基础上扩容,提供多余的空间储存数据;这种办法,不会造成多余开辟空间,对空间的浪费。也不会遇到储存数据太多,空间不够的情况(在正常内存范围内);下面同样使用三个函数文件实现:

Seqlist.h

#ifndef __SeqList_H__ #define __SeqList_H__ #include<stdio.h>#include<string.h>#include<stdlib.h>#include<assert.h>typedef int DataType;#define PrintType "%d "//#define MAX 10#define Orgin_capacity 2#define Expand_INC 2typedef struct SeqList{DataType *data;//动态数组int sz;//顺序表元素个数int capacity;//当前容量}SeqList,*pSeqList;void InitSeqList(pSeqList ps);//初始化void CheckSeqList(pSeqList ps);//内存大小检查及处理void DestorySeqList(pSeqList ps);//内存释放void PushBack(pSeqList ps, DataType d);//尾部插入数据dvoid PushFront(pSeqList ps, DataType d);//在头部插入数据dvoid DisPlay(pSeqList ps);//打印所有数据void PopBack(pSeqList ps);//尾部删除数据void PopFront(pSeqList ps);//头部删除数据int Find(pSeqList ps, DataType d);//删除指定位置的数据void Insert(pSeqList ps, DataType d, int pos);//在指定的位置插入数据void Remove(pSeqList ps, DataType d);//删除数据dvoid RemoveAll(pSeqList ps, DataType d);//删除所有相同的数据dvoid Reverse(pSeqList ps);//将所有数据逆序void Sort(pSeqList ps);//给所有数据排序int BinarySearch(pSeqList ps, DataType d);//二分查找指定数据#endif//__SeqList_H__ 
Seqlist.c

#include"Seqlist.h"void InitSeqList(pSeqList ps){assert(ps != NULL);ps->sz = 0;ps->data = malloc(sizeof(DataType)*Orgin_capacity);//ps->sz = 0;if (ps->data == NULL){perror("use malloc");exit(EXIT_FAILURE);}memset(ps->data, 0, sizeof(DataType)*Orgin_capacity);ps->capacity = Orgin_capacity;}void CheckSeqList(pSeqList ps){assert(ps != NULL);if (ps->capacity==ps->sz){DataType *ptr = (DataType*)realloc(ps->data, (sizeof(DataType))*(ps->capacity + Expand_INC));if (ptr == NULL){perror("use realloc");exit(EXIT_FAILURE);}else{ps->data = ptr;}ps->capacity += Expand_INC;printf("增容成功!\n");}}void DestorySeqList(pSeqList ps){assert(ps);free(ps->data);ps->sz = 0;ps->capacity = 0;}void DisPlay(pSeqList ps){int i= 0;assert(ps != NULL);if (ps->sz == 0){return;}for (i = 0; i < ps->sz; i++){printf(PrintType, ps->data[i]);}printf("\n");}void PushBack(pSeqList ps, DataType d){assert(ps != NULL);CheckSeqList(ps);ps->data[ps->sz] = d;ps->sz++;/////*if (ps->sz == MAX)////{////return;////}////else*////////{////ps->data[ps->sz] = d;////ps->sz++;//////}}void PushFront(pSeqList ps, DataType d){int i = 0;assert(ps != NULL);CheckSeqList(ps);/*if (ps->sz == MAX){return;}*/for (i = ps->sz-1; i >= 0; i--){ps->data[i+1] = ps->data[i];}ps->data[0] = d;ps->sz++;}void PopBack(pSeqList ps){assert(ps != NULL);if (ps->sz == 0){return;}ps->sz--;}void PopFront(pSeqList ps){assert(ps);memmove(ps->data , ps->data+1, (ps->sz - 1)*sizeof(DataType));ps->sz--;}int Find(pSeqList ps, DataType d){int i = 0;assert(ps != NULL);for (i = 0; i < ps->sz; i++){if (ps->data[i] == d){return i;}}return -1;}void Insert(pSeqList ps, DataType d,int pos){assert(ps != NULL);CheckSeqList(ps);/*if (ps->sz == MAX){return;}*/memmove(ps->data + pos + 1, ps->data + pos, (ps->sz - pos)*sizeof(DataType));ps->data[pos] = d;ps->sz++;}void Remove(pSeqList ps, DataType d){int pos = 0;assert(ps != NULL);if (ps->sz == 0){return;}    pos = Find(ps, d);if (pos != -1){memmove(ps->data + pos, ps->data + pos+1, sizeof(DataType)*(ps->sz - pos - 1));ps->sz--;}}void RemoveAll(pSeqList ps, DataType d){int i = 0;assert(ps != NULL);if (ps->sz == 0){return;}while ((Find(ps, d)) != -1){memmove(ps->data + i, ps->data + i + 1, sizeof(DataType)*(ps->sz - i));ps->sz--;}}void Reverse(pSeqList ps){int left = 0;int right = ps->sz - 1;assert(ps);if (ps->sz == 0){return;}while (left < right){int tmp = ps->data[left];ps->data[left] = ps->data[right];ps->data[right] = tmp;left++;right--;}}void Sort(pSeqList ps){int i = 0;int j = 0;assert(ps);if (ps->sz == 0){return;}for (i = 0; i < ps->sz-1; i++){for (j = 0; j < (ps->sz - i - 1); j++){if (ps->data[j]>ps->data[j + 1]){DataType tmp = ps->data[j];ps->data[j] = ps->data[j + 1];ps->data[j + 1] = tmp;}}}}int BinarySearch(pSeqList ps, DataType d){int left = 0;int right = ps->sz - 1;int mid = left + ((right - left) >> 2);while (left <= right){if (ps->data[mid] == d)return mid;else if (ps->data[mid] > d){right = mid - 1;}else{left = mid + 1;}}return -1;}
test.c

#define _CRT_SECURE_NO_WARNINGS 1#include"Seqlist.h"void test1(){SeqList my_list;        InitSeqList(&my_list);PushBack(&my_list,1);PushBack(&my_list,2);/*PushBack(&my_list,3);PushBack(&my_list,4);*/        DisPlay(&my_list);PushFront(&my_list, 5);PushFront(&my_list, 6);/*PushFront(&my_list, 7);PushFront(&my_list, 8);*/DisPlay(&my_list);PopBack(&my_list);DisPlay(&my_list);PopFront(&my_list);DisPlay(&my_list);}void test2(){SeqList my_list;InitSeqList(&my_list);PushBack(&my_list, 1);PushBack(&my_list, 2);DisPlay(&my_list);PushBack(&my_list, 3);PushBack(&my_list, 4);DisPlay(&my_list);PushFront(&my_list, 5);PushFront(&my_list, 6);DisPlay(&my_list);PushFront(&my_list, 7);PushFront(&my_list, 8);DisPlay(&my_list);PopBack(&my_list);DisPlay(&my_list);PopFront(&my_list);DisPlay(&my_list);int pos = Find(&my_list, 3);//查找  printf("要寻找的下标为:%d \n", pos);DisPlay(&my_list);    Insert(&my_list, 6, 2);DisPlay(&my_list);Remove(&my_list,3);    DisPlay(&my_list);Remove(&my_list, 7);DisPlay(&my_list);Sort(&my_list);DisPlay(&my_list);int mid = BinarySearch(&my_list, 2);printf("二分法查找要寻找的下标为:%d \n", mid);DisPlay(&my_list);Reverse(&my_list);DisPlay(&my_list);RemoveAll(&my_list, 6);DisPlay(&my_list);Remove(&my_list, 5);DisPlay(&my_list);//DestorySeqList(&my_list);}    int main(){SeqList my_list;InitSeqList(&my_list);//test1();test2();DestorySeqList(&my_list);system("pause");return 0;}




原创粉丝点击