【C语言】C语言实现静态顺序表

来源:互联网 发布:java交换两个数 编辑:程序博客网 时间:2024/06/10 17:29

     在我们学习C语言的过程中,会遇到线性表,这本来应该属于数据结构的一部分,但是也能通过C语言来解决。所谓线性表,就是定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识。只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作。 顺序表的实现和静态通讯录相似,通讯录的实现已经在前面的博客中为大家总结(【通讯录】点击打开链接)。下面附上顺序表的代码,部分问题已经在代码中给予解释。

SeqList.h

#ifndef __SEQLIST_H__#define __SEQLIST_H__#include <stdio.h>#include <assert.h>#include <string.h>#include <stdlib.h>#define MAX 10typedef int DataType;typedef struct SeqList{int sz;DataType data[MAX];}SeqList, *pSeqList;void InitSeqList(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_

SeqList.c

#include "SeqList.h"//初始化void InitSeqList(pSeqList ps){assert(ps != NULL);memset(ps->data, 0, MAX*sizeof(DataType));ps->sz = 0;}//尾部添加void PushBack(pSeqList ps, DataType d){assert(ps != NULL);if (ps->sz == MAX){return;}ps->data[ps->sz] = d;ps->sz++;}//尾部删除void PopBack(pSeqList ps){assert(ps != NULL);if (ps->sz == 0){return;}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 PushFront(pSeqList ps, DataType d){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){int i = 0;assert(ps != NULL);if (ps->sz == 0){return;}for (i = 0; i < ps->sz - 1; i++){ps->data[i] = ps->data[i + 1];}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){int i = 0;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);pos = Find(ps, d);if (pos != -1){memmove(ps->data + pos, ps->data + pos + 1, (ps->sz - pos - 1)*sizeof(DataType));ps->sz--;}}void RemoveAll(pSeqList ps, DataType d){int pos = 0;assert(ps != NULL);while ((pos = Find(ps, d)) != -1){Remove(ps, d);}}void Reverse(pSeqList ps){int left = 0;int right = ps->sz - 1;DataType tmp = 0;if (ps->sz == 0){return;}while (left < right){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 - 1 - i; 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;int mid = left + ((right - left) >> 1);assert(ps);while (left <= right){if (ps->data[mid] == d){return mid;}else if (ps->data[mid] > d){right = mid - 1;}else if (ps->data[mid] < d){left = mid + 1;}return -1;}}

test.c

#include"SeqList.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);PopBack(&my_list);Display(&my_list);PopBack(&my_list);Display(&my_list);}void test2(){SeqList my_list;InitSeqList(&my_list);PushFront(&my_list, 1);PushFront(&my_list, 2);PushFront(&my_list, 2);PushFront(&my_list, 4);PushFront(&my_list, 5);Display(&my_list);RemoveAll(&my_list, 2);Display(&my_list);}void test3(){SeqList my_list;InitSeqList(&my_list);PushBack(&my_list, 1);PushBack(&my_list, 5);PushBack(&my_list, 4);PushBack(&my_list, 2);PushBack(&my_list, 3);Display(&my_list);//Insert(&my_list, 2, 4);Sort(&my_list);Display(&my_list);}void test4(){SeqList my_list;int ret = 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,2);//Reverse(&my_list);ret = BinarySearch(&my_list, 3);printf("%d\n", ret);}int main(){test3();system("pause");return 0;}

生成的程序窗口:


   

 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。静态顺序表能够实现尾插,头插,尾删,头删,显示,指定位置插入、指定位置删除,删除某一特定元素,删除顺序表中出现的所有的特定元素,逆序,排序,二分查找等等。新手上路,大神勿喷。文中出现的错误欢迎大家评批指正!

      

原创粉丝点击