用C语言实现静态顺序表

来源:互联网 发布:c语言层次遍历二叉树 编辑:程序博客网 时间:2024/05/18 00:50

     用C语言实现顺序表一般有静态和动态两种,静态顺序表在实行的过程中是直接定义一个数组,用他来存放数据,数据在顺序表中的存储是连续存放的,下面我将用三个函数文件来实现一个简单的顺序表,并且实现增、删、查、逆序、排序等功能:

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 10typedef struct SeqList{DataType data[MAX];int sz;}SeqList,*pSeqList;void InitSeqList(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
Seqlist.c(函数的实现过程)
#include"Seqlist.h"void InitSeqList(pSeqList ps){assert(ps != NULL);memset(ps, 0, sizeof(SeqList));ps->sz = 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);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);if (ps->sz == MAX){return;}for (i = ps->sz; i > 0; i--){ps->data[i] = ps->data[i - 1];}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);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(){struct 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(){struct 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);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);}    int main(){//test1();test2();system("pause");return 0;}



原创粉丝点击