动态实现简单【顺序表】

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

1、头文件 Seqlist.h

#ifndef __SEQLIST_H__#define __SEQLIST_H__#include <stdio.h>#include <string.h>#include <assert.h>#include <stdlib.h>//#define MAX 10#define DEFAULT_SZ 3#define DEFAULT_INC 2typedef int Datatype;  typedef struct Seqlist{//Datatype data[MAX];Datatype *data;int sz;int capa;}Seqlist, *pSeqlist;void Initseqlist(pSeqlist ps);//初始化void Checkcapa(pSeqlist ps);//增容void Display(const pSeqlist ps);//打印函数void Pushback(pSeqlist ps, Datatype d);//从尾部添加元素void Popback(pSeqlist ps);//从尾部删除函数void Pushfront(pSeqlist ps, Datatype d);//从首部添加元素void Popfront(pSeqlist ps);//从首部删除元素void Insert(pSeqlist ps, Datatype d, int pos);//在指定位置插入元素void Remove(pSeqlist ps, Datatype d);//删除指定元素的第一次出现void Remove_all(pSeqlist ps, Datatype d);//删除指定元素的所有出现次数void Reverse(pSeqlist ps);//逆序void Sort(pSeqlist ps);//排序int Binarysearch(pSeqlist ps, Datatype d);//二分法查找元素#endif

2、功能函数  Seqlist.c

#define _CRT_SECURE_NO_WARNINGS 1#include "Seqlist.h"void Initseqlist(pSeqlist ps){ps->sz = 0;ps->data = malloc(DEFAULT_SZ*sizeof(Datatype));if (ps->data == NULL){perror("malloc");exit(EXIT_FAILURE);}memset(ps->data, 0, DEFAULT_SZ*sizeof(Datatype));ps->capa = DEFAULT_SZ;}void Checkcapa(pSeqlist ps){if (ps->sz == ps->capa){Datatype *p = realloc(ps->data, (DEFAULT_INC+ps->capa)*sizeof(Datatype));if (p == NULL){perror("realloc");exit(EXIT_FAILURE);}else{ps->data = p;}ps->capa = ps->capa + DEFAULT_INC;printf("增容成功!!!\n");}}void Display(const pSeqlist ps){assert(ps != NULL);int i = 0;while (i < ps->sz){printf("%d ", ps->data[i]);i++;}printf("\n");}void Pushback(pSeqlist ps, Datatype d){Checkcapa(ps);assert(ps != NULL);/*if (ps->sz == MAX){return;}*/ps->data[ps->sz] = d;ps->sz++;}void Popback(pSeqlist ps){assert(ps != NULL);ps->data[ps->sz] = 0;ps->sz--;}void Pushfront(pSeqlist ps, Datatype d){Checkcapa(ps);assert(ps != NULL);/*if (ps->sz == MAX){return;}*/memmove(ps->data+1, ps->data, sizeof(Datatype)*ps->sz);ps->data[0] = d;ps ->sz++;}void Popfront(pSeqlist ps){assert(ps != NULL);memmove(ps->data, ps->data + 1, sizeof(Datatype)*(ps->sz - 1));ps->data[ps->sz-1] = 0;ps->sz--;}void Insert(pSeqlist ps, Datatype d, int pos){assert(ps != NULL);/*if (ps->sz == MAX){return;}*/if (pos < ps->sz){memmove(ps->data + pos + 1, ps->data + pos, sizeof(Datatype)*(ps->sz - pos));ps->data[pos] = d;ps->sz++;}else{printf("无法插入元素!\n");}}int Find(pSeqlist ps, Datatype d){assert(ps != NULL);int i = 0;while (i < ps->sz){if (ps->data[i] == d){return i;}else{i++;}}if (i >=ps->sz){return -1;}}void Remove(pSeqlist ps, Datatype d){assert(ps != NULL);int ret = Find(ps, d);if (ret >= 0){memmove(ps->data + ret, ps->data + ret + 1, sizeof(Datatype)*(ps->sz - ret));ps->sz--;}else{printf("没有找到该元素!!!\n");}}void Remove_all(pSeqlist ps, Datatype d){assert(ps != NULL);while ((Find(ps, d) <= ps->sz) && (Find(ps, d)>=0)){Remove(ps, d);}}void Reverse(pSeqlist ps){assert(ps != NULL);int i = 0;int j = ps->sz-1;while (i <j){Datatype tmp;tmp = ps->data[i];ps->data[i] = ps->data [j];ps->data [j] = tmp;i++;j--;}}void Sort(pSeqlist ps){assert(ps != NULL);int i = 0;int j = 0;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;tmp = ps->data[j];ps->data[j] = ps->data[j+1];ps->data[j+1] = tmp;}}}}int Binarysearch(pSeqlist ps, Datatype d){assert(ps != NULL);Datatype left = 0;Datatype right = ps->sz - 1;while (left <= right){Datatype mid = left + (right - left) / 2;if (ps->data[mid] < d){left = mid + 1;}else if (ps->data[mid]>d){right = mid - 1;}else{printf("你所要查找的元素下标为:%d\n", mid);return mid;}}}

3、测试函数 test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "Seqlist.h"void test1()//在尾部添加和删除元素{Seqlist list;Initseqlist(&list);Pushback(&list, 1);Pushback(&list, 2);Pushback(&list, 3);Pushback(&list, 4);Display(&list);Popback(&list);Display(&list);Popback(&list);Display(&list);Popback(&list);Display(&list);Popback(&list);Display(&list);}void test2()//在首部添加和删除元素{Seqlist list;Initseqlist(&list);Pushfront(&list, 1);Pushfront(&list, 2);Pushfront(&list, 3);Pushfront(&list, 4);Pushfront(&list, 5);Pushfront(&list, 6);Pushfront(&list, 7);Pushfront(&list, 8);Pushfront(&list, 9);Display(&list);Popfront(&list);Display(&list);Popfront(&list);Display(&list);Popfront(&list);Display(&list);Popfront(&list);Display(&list);}void test3()//在指定位置插入元素{Seqlist list;Initseqlist(&list);Pushfront(&list, 1);Pushfront(&list, 2);Pushfront(&list, 4);Pushfront(&list, 5);Pushfront(&list, 6);Display(&list);Insert(&list, 3, 3);Display(&list);}void test4()//在指定元素第一次出现的位置删除该元素{Seqlist list;Initseqlist(&list);Pushfront(&list, 1);Pushfront(&list, 2);Pushfront(&list, 1);Pushfront(&list, 3);Pushfront(&list, 1);Pushfront(&list, 4);Display(&list);Remove(&list, 1);Display(&list);}void test5()//在该元素所有出现的位置删除该元素{Seqlist list;Initseqlist(&list);Pushfront(&list, 1);Pushfront(&list, 2);Pushfront(&list, 1);Pushfront(&list, 3);Pushfront(&list, 1);Pushfront(&list, 4);Display(&list);Remove_all(&list, 1);Display(&list);}void test6()//逆序{Seqlist list;Initseqlist(&list);Pushfront(&list, 1);Pushfront(&list, 2);Pushfront(&list, 3);Pushfront(&list, 4);Pushfront(&list, 5);Pushfront(&list, 6);Display(&list);Reverse(&list);Display(&list);}void test7()//排序并进行二分查找指定元素{Seqlist list;Initseqlist(&list);Pushfront(&list, 2);Pushfront(&list, 5);Pushfront(&list, 1);Pushfront(&list, 6);Pushfront(&list, 3);Pushfront(&list, 4);Display(&list);Sort(&list);Display(&list);Binarysearch(&list, 5);}int main(){test2();return 0;}