头文件:
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include<malloc.h>
typedef int SLDateType; //数据
typedef struct SeqList
{
SLDateType* a; //指向数据的指针
size_t size; //有效数据的长度
size_t capacity; // 容量
}SeqList;
// 对数据的管理:增删查改
void SeqListInit(SeqList* ps); //初始化
void SeqListDestory(SeqList* ps); //销毁
void SeqListPrint(SeqList* ps); //打印
void SeqListPushBack(SeqList* ps, SLDateType x); //尾插
void SeqListPushFront(SeqList* ps, SLDateType x); //头插
void SeqListPopFront(SeqList* ps); //头删
void SeqListPopBack(SeqList* ps); //尾删
int SeqListFind(SeqList* ps, SLDateType x); //查找
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, size_t pos);
测试部分:
#include "SeqList.h"
void SeqListInit(SeqList* ps) //初始化
{
assert(ps);
ps->a = NULL;
ps->size = 0;
ps->capacity = 0;
}
void SeqListDestory(SeqList* ps) //销毁
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->size = ps->capacity = 0;
}
void SeqListPrint(SeqList* ps) //打印
{
assert(ps);
for (size_t i = 0; i < ps->size; ++i)
{
printf("%d ", ps->a[i]);
}
printf("%\n");
}
void CheckCacpity(SeqList* ps) //核对容量大小,不够了在realloc
{
if (ps->size == ps->capacity)
{
size_t newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
ps->a = (SLDateType*)realloc(ps->a, newcapacity*sizeof(SLDateType));
ps->capacity = newcapacity;
}
}
void SeqListPushBack(SeqList* ps, SLDateType x) //尾插
{
assert(ps);
CheckCacpity(ps);
ps->a[ps->size] = x;
ps->size++;
//SeqListInsert(ps, ps->size, x);
}
void SeqListPushFront(SeqList* ps, SLDateType x) //头插
{
assert(ps);
CheckCacpity(ps);
size_t end = ps->size;
while (end > 0)
{
ps->a[end] = ps->a[end - 1];
--end;
}
ps->a[0] = x;
++ps->size;*/
//SeqListInsert(ps, 0, x); 也可以用任意插函数
}
void SeqListPopFront(SeqList* ps) //头删
{
assert(ps);
size_t start = 0;
while (start < ps->size-1)
{
ps->a[start] = ps->a[start + 1];
++start;
}
size_t start = 1;
while (start < ps->size)
{
ps->a[start-1] = ps->a[start];
++start;
}
--ps->size;
// SeqListErase(ps, 0); 也可以用任意删函数
}
void SeqListPopBack(SeqList* ps) //尾删
{
assert(ps);
ps->a[ps->size - 1] = 0;
ps->size--;
// SeqListErase(ps, ps->size-1);
}
void SeqListFind(SeqList* ps, SeqDataType x) //查找
{
assert(ps);
CheckSeq(ps);
for (int i = 0; i < ps->size; ++i)
{
if (ps->s[i] == x)
{
printf("数据的位置为%d\n", i+1);
return;
}
}
printf("查询的数据不存在\n");
}
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)
{
assert(ps);
assert(pos <= ps->size);
CheckCacpity(ps);
int end = ps->size - 1;
while (end >= (int)pos)
{
ps->a[end + 1] = ps->a[end];
--end;
}
size_t end = ps->size ;
while (end > pos)
{
ps->a[end] = ps->a[end - 1];
--end;
}
ps->a[pos] = x;
ps->size++;
}
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, size_t pos)
{
assert(ps && pos < ps->size);
size_t start = pos;
while (start < ps->size-1)
{
ps->a[start] = ps->a[start + 1];
++start;
}
size_t start = pos+1;
while (start < ps->size)
{
ps->a[start-1] = ps->a[start];
++start;
}
ps->size--;
}
主函数:
#include"test.h"
test(SeqList *s)
{
SeqListInit(s);
SeqListPushBack(s, 10);
SeqListPushBack(s, 9);
SeqListPushBack(s, 8);
SeqListPushBack(s, 7);
SeqListPushBack(s, 6);
SeqListPushBack(s, 5);
SeqListPrint(s);
printf("\n");
SeqListPopBack(s);
SeqListPopFront(s);
SeqListPrint(s);
printf("\n");
SeqListPushFront(s, 100);
SeqListPrint(s);
printf("\n");
SeqListInsert(s, 2, 500);
SeqListPrint(s);
printf("\n");
SeqListPopFront(s);
SeqListPrint(s);
printf("\n");
SeqListErase(s, 2);
SeqListPrint(s);
printf("\n");
SeqListFind(s, 7);
SeqListFind(s, 6);
SeqListFind(s, 3);
SeqListPrint(s);
printf("\n");
}
int main()
{
SeqList s;
test(&s);
return 0;
}