数组是一种线性数据结构,而这种数据结构就称之为顺序表。
动态顺序表将静态顺序表中的数组数据类型改成了指针类型方便内存的开辟。
动态顺序表相较于静态顺序表的优点:开辟的空间灵活自如,添加元素时自动增容,删除元素时自动减容,节省内存空间。
*注意:malloc开辟的内存空间以后调用销毁空函数destory_mylist(&my_list)进行内存释放。
SeqListD.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include<stdio.h>
#include<stdlib.h>
#include <assert.h>
#define DEDAULT_SZ 2 //定义顺序表容量的初始化值
#define INC 1
typedef int DataType;//定义顺序表数据类型
typedef struct SeqList
{
DataType *data;//数据类型
int sz;//元素数量
int capacity;//容量
}SeqList, *pSeqList;
void InitSeqList(pSeqList ps);//初始化顺序表
void destory_mylist(pSeqList ps);//销毁初始化的空间
void checkcapalist(pSeqList ps);//增容函数
void delecapalist(pSeqList ps);//减容函数
void PushBack(pSeqList ps, DataType d);//在尾部插入元素
void PopBack(pSeqList ps);//在尾部删除元素
void Display(const pSeqList ps);//打印顺序表
void PushFront(pSeqList ps, DataType d);//在头部插入元素
void PopFront(pSeqList ps);//删除首元素
int Find(pSeqList ps, DataType d);//查找你要的元素
void Insert(pSeqList ps, DataType d, int pos);//在指定的位置插入元素
void Remove(pSeqList ps, DataType d);//删除指定元素
void RemoveAll(pSeqList ps, DataType d);//删除你要删除的的出现的所有元素
void Reverse(pSeqList ps);//逆序
void Sort(pSeqList ps);//排序
int BinarySearch(pSeqList ps, DataType d);//二分查找
#endif //__SEQLIST_H__
Test.c
#include"SeqListD.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);
//打印时候可以不传地址,因为只打印,不会改它,只要拿到里面的数据就可以了。
//形参是实参的临时拷贝,数据sz全部传过去,打印没有任何问题,但这样做不好。
//结构体传参,传地址,不要传变量,因为传变量系统压栈的开销比较大,结构体可能会大。所以传地址比较好。
PopBack(&my_list);
Display(&my_list);
PopBack(&my_list);
Display(&my_list);
PopBack(&my_list);
Display(&my_list);
PopBack(&my_list);
Display(&my_list);
destory_mylist(&my_list);
}
void test2()
{
SeqList my_list;
InitSeqList(&my_list);//初始化顺序表
PushFront(&my_list, 1);
PushFront(&my_list, 2);
PushFront(&my_list, 3);
PushFront(&my_list, 4);
Display(&my_list);
PopFront(&my_list);
Display(&my_list);
PopFront(&my_list);
Display(&my_list);
PopFront(&my_list);
Display(&my_list);
PopFront(&my_list);
Display(&my_list);
destory_mylist(&my_list);
}
void test3()
{
SeqList my_list;
int pos = 0;
InitSeqList(&my_list);//初始化顺序表
PushFront(&my_list, 1);
PushFront(&my_list, 2);
PushFront(&my_list, 3);
PushFront(&my_list, 4);
PushFront(&my_list, 5);
pos = Find(&my_list, 4);
if (pos == -1)
{
printf("要查找的元素不存在\n");
}
else
{
Insert(&my_list, 6, pos);//把6插入pos的位置上
}
Display(&my_list);
destory_mylist(&my_list);
}
void test4()
{
SeqList my_list;
int pos = 0;
InitSeqList(&my_list);//初始化顺序表
PushFront(&my_list, 1);
PushFront(&my_list, 2);
PushFront(&my_list, 3);
PushFront(&my_list, 4);
PushFront(&my_list, 5);
Display(&my_list);
Remove(&my_list, 3);
Display(&my_list);
destory_mylist(&my_list);
}
void test5()
{
SeqList my_list;
int pos = 0;
InitSeqList(&my_list);//初始化顺序表
PushFront(&my_list, 1);
PushFront(&my_list, 3);
PushFront(&my_list, 3);
PushFront(&my_list, 2);
PushFront(&my_list, 3);
PushFront(&my_list, 4);
PushFront(&my_list, 3);
PushFront(&my_list, 5);
PushFront(&my_list, 3);
Display(&my_list);
RemoveAll(&my_list, 3);
Display(&my_list);
destory_mylist(&my_list);
}
void test6()
{
SeqList my_list;
InitSeqList(&my_list);//初始化顺序表
PushFront(&my_list, 1);
PushFront(&my_list, 2);
PushFront(&my_list, 3);
PushFront(&my_list, 4);
PushFront(&my_list, 5);
Display(&my_list);
Reverse(&my_list);
Display(&my_list);
destory_mylist(&my_list);
}
void test7()
{
SeqList my_list;
int pos = 0;
InitSeqList(&my_list);//初始化顺序表
PushFront(&my_list, 1);
PushFront(&my_list, 2);
PushFront(&my_list, 3);
PushFront(&my_list, 4);
PushFront(&my_list, 5);
Display(&my_list);
Sort(&my_list);
Display(&my_list);
pos = BinarySearch(&my_list, 3);
printf("%d\n", pos);
pos = BinarySearch(&my_list, 6);
printf("%d\n", pos);
destory_mylist(&my_list);
}
int main()
{
test6();
system("pause");
return 0;
}
SeqListD.C
#include"SeqListD.h"
void InitSeqList(pSeqList ps)//初始化顺序表,动态开辟内存
{
assert(ps != NULL);
ps->sz = 0;
ps->capacity = DEDAULT_SZ;//容量初始化为2
ps->data = (DataType *)malloc((ps->capacity)*sizeof(DataType));
if (ps->data == NULL)
{
perror("molloc");
exit(EXIT_FAILURE);
}
memset(ps->data, 0, (ps->capacity)*sizeof(DataType));
}
void destory_mylist(pSeqList ps)//free初始化的时候动态开辟的空间
{
assert(ps != NULL);
free(ps->data);
ps->data = NULL;
ps->sz = 0;
ps->capacity = 0;
}
void checkcapalist(pSeqList ps)
{
assert(ps != NULL);
if (ps->sz == ps->capacity)//如果等于容量就满了就增容
{
DataType *ptr = realloc(ps->data, (ps->capacity + INC)*sizeof(DataType));
if (ptr != NULL)
{
ps->data = ptr;
ps->capacity += INC;
}
else
{
perror("realloc");
exit(EXIT_FAILURE);
}
}
}
void PushBack(pSeqList ps, DataType d)//在尾部插入尾函数
{
assert(ps != NULL);
checkcapalist(ps);//进行增容
ps->data[ps->sz] = d;
ps->sz++;
}
void Display(const pSeqList ps)//打印函数
{
int i = 0;
assert(ps != NULL);
for (i = 0; i < ps->sz; i++)
{
printf("%d ", ps->data[i]);
}
printf("\n");
}
void PopBack(pSeqList ps)//删除尾部的元素函数
{
assert(ps != NULL);
ps->sz--;
}
void PushFront(pSeqList ps, DataType d)//从头部开始插入元素
{
assert(ps != NULL);
checkcapalist(ps);//是否需要增容
int i = 0;
for (i = ps->sz; i>0; i--)
{
ps->data[i] = ps->data[i - 1];
}
ps->data[0] = d;
ps->sz++;
}
void delecapalist(pSeqList ps)//减容函数
{
assert(ps != NULL);
if (ps->sz < ps->capacity)
{
DataType *ptr = realloc(ps->data, (ps->capacity - INC)*sizeof(DataType));
if (ptr != NULL)
{
ps->data = ptr;
ps->capacity -= INC;
}
else
{
perror("realloc");
exit(EXIT_FAILURE);
}
}
}
void PopFront(pSeqList ps)//删除头部
{
int i = 0;
assert(ps != NULL);
for (i = 0; i < ps->sz; i++)
{
ps->data[i] = ps->data[i + 1];
}
ps->sz--;
delecapalist(ps);//减容
}
int Find(pSeqList ps, DataType d)//查找第几个元素
{
int i = 0;
if (ps != NULL);
for (i = 0; i < ps->sz; i++)
{
if (ps->data[i] == ps->data[d - 1])
return ps->data[i];
}
return -1;
}
void Insert(pSeqList ps, DataType d, int pos)//指定位置插入元素,d要插入的元素,pos指定位置
{
assert(ps != NULL);
checkcapalist(ps);//增容
int i = 0;
for (i = ps->sz; i>pos - 1; i--)
{
ps->data[i] = ps->data[i - 1];
}
ps->data[pos - 1] = d;
ps->sz++;
}
void Remove(pSeqList ps, DataType d)//删除你要删除的第一个出现的元素
{
int i = 0, j = 0;;
assert(ps != NULL);
for (i = 0; i < ps->sz; i++)
{
if (ps->data[i] == d)
{
for (j = i; j < ps->sz; j++)
{
ps->data[j] = ps->data[j + 1];
}
ps->sz--;
delecapalist(ps);//减容
break;
}
}
}
void RemoveAll(pSeqList ps, DataType d)//删除你要删除的所有元素
{
int i = 0, j = 0;;
assert(ps != NULL);
for (i = 0; i < ps->sz; i++)
{
if (ps->data[i] == d)
{
for (j = i; j < ps->sz; j++)
{
ps->data[j] = ps->data[j + 1];
}
ps->sz--;
delecapalist(ps);//减容
i = 0;
}
}
}
void Reverse(pSeqList ps)//逆序
{
assert(ps != NULL);
int i = 0, j = ps->sz - 1;
int n = ps->sz / 2;
for (i = 0; i <= n / 2; i++, j--)
{
int temp = 0;
temp = ps->data[i];
ps->data[i] = ps->data[j];
ps->data[j] = temp;
}
}
void Sort(pSeqList ps)//排序,采用的是冒泡排序
{
assert(ps != NULL);
int i = 0, j = 0;
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - 1 - i; j++)
{
int temp = 0;
if (ps->data[j]>ps->data[j + 1])
{
temp = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = temp;
}
}
}
}
int BinarySearch(pSeqList ps, DataType d)//二分查找,d表示你要查找的元素
{
int left = 0;
int right = ps->sz - 1;
while (left < right)
{
int mid = (right - left) / 2 + left;
if (d>ps->data[mid])
{
left = mid + 1;
}
else if (d < ps->data[mid])
{
right = mid - 1;
}
else
{
return mid;
}
}
}