阅读量:0
1.SeqList.h 头文件
#pragma once #include <stdio.h> #include <stdlib.h> #include <assert.h> //定义动态顺序表 typedef int SLDatatype; typedef struct SeqLlist { SLDatatype* arr; int capacity; int size; }SL; //typedef struct SeqList Sl; //初始化 void SLInit(SL* ps); //销毁 void SLDestory(SL* ps); //尾插入数据 void SLPushBack(SL* ps,SLDatatype x); //打印顺序表 void SLPrint(SL* ps); //头插 void SLPushFront(SL* ps,SLDatatype x); //删除 void SLPopBack(SL* ps); void SLPopFront(SL* ps); //在指定位置之前插入数据 void SLInsert(SL* ps, SLDatatype x, int pos); //删除指定位置的数据 void SLErase(SL* ps, int pos); //查找数据 int SLFind(SL* ps, SLDatatype x);
2.SeqList.c文件
#include "Seqlist.h" //初始化 //错误1:使用了未初始化的局部变量“s” //void SLInit(SL s)--值传递 void SLInit(SL* ps) { ps->arr = NULL; ps->capacity = ps->size = 0; } //判断空间是否充足 void SLCheckCapacity(SL* ps) { if (ps->size == ps->capacity) { //增容0*2=0 //若capacity为0,给个默认值,否则*2 int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity; SLDatatype* tmp = (SLDatatype*)realloc(ps->arr, newCapacity * sizeof(SLDatatype)); if (tmp == NULL) { perror("realloc faile!"); exit(1); } ps->arr = tmp; ps->capacity = newCapacity; } } //尾插 void SLPushBack(SL* ps,SLDatatype x) { //温柔的解决方式 //if (ps == NULL) //{ // return; //} //粗暴的解决方式 assert(ps); SLCheckCapacity(ps); ps->arr[ps->size] = x; ps->size++; } //打印操作 void SLPrint(SL* ps) { for (int i = 0; i < ps->size; i++) { printf("%d ", ps->arr[i]); } printf("\n"); } //头插 void SLPushFront(SL* ps,SLDatatype x) { assert(ps); //判断空间是否足够 SLCheckCapacity(ps); //数据整体后移动1位 for (int i = ps->size; i > 0; i--) { ps->arr[i] = ps->arr[i - 1]; } //下标为0的位置空出来 ps->arr[0] = x; ps->size++; } //销毁 void SLDestory(SL* ps) { if (ps->arr != NULL) { free(ps->arr); } ps->arr = NULL; ps->capacity = ps->size = 0; } //删除 void SLPopBack(SL* ps) { assert(ps); assert(ps->size); ps->arr[ps->size - 1] = 0; ps->size--; } void SLPopFront(SL* ps) { assert(ps); assert(ps->size); //数据整体向前挪动一个位置 for (int i = 0; i < ps->size - 1; i++) { ps->arr[i] = ps->arr[i + 1]; } ps->size--; } //在指定位置之前插入数据(空间足够才能插入数据) void SLInsert(SL* ps, SLDatatype x, int pos) { assert(ps); assert(pos >= 0 && pos <= ps->size); SLCheckCapacity(ps); //pos之后的数据向后移动一位 for (int i = ps->size; i > pos; i--) { ps->arr[i] = ps->arr[i-1]; } ps->arr[pos] = x; ps->size++; } //删除指定位置的数据 void SLErase(SL* ps, int pos) { assert(ps); assert(pos >= 0 && pos <= ps->size); //pos之后的数据整体向前移动1位 for (int i = 0; i < ps->size - 1; i++) { ps->arr[i] = ps->arr[i + 1]; } ps->size--; } //查找数据 int SLFind(SL* ps, SLDatatype x) { assert(ps); for (int i = 0; i < ps->size; i++) { if (ps->arr[i] = x) { return i; } } //没有找到,返回一个无效的下标 return -1; }
3.test.c文件
#include "Seqlist.h" void SLtest01() { SL s; SLInit(&s); //SLPushBack(&s, 1); //SLPushBack(&s, 2); //SLPushBack(&s, 3); //SLPushBack(&s, 4); //SLPushBack(&s, 5); //SLPushBack(&s, 6); //SLPushBack(NULL, 6); SLPushFront(&s, 1); SLPushFront(&s, 2); SLPushFront(&s, 3); SLPushFront(&s, 4); //尾删除 //SLPopBack(&s); //SLPopBack(&s); //SLPopBack(&s); //SLPopBack(&s); //SLPopBack(&s); //头删除 //SLPopFront(&s); //为空不能删除 //SLInsert(&s,11,0); //SLInsert(&s,22,s.size); //SLErase(&s, 0); //SLErase(&s, s.size-1); SLPrint(&s); //查找数据 int find = SLFind(&s, 2); if (find >= 0) { printf("找到了\n"); } else { printf("没有找到\n"); } } int main() { SLtest01(); return 0; }