【顺序表】用c语言简单实现顺序表
来源:互联网 发布:云南管家婆软件总代理 编辑:程序博客网 时间:2024/05/29 14:23
今天,写了一个简单的顺序表,跟大家分享一下(我是先写的静态,后改的动态,中间的一些注释是原来的静态):
test.h#ifndef __SEPLIST_H__#define __SEPLIST_H__#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>//#define MAX 100#define DEFAULT_SZ 3 //当前默认有效值#define ISC_SZ 2 //动态分配默认增长个数typedef int DataType;typedef struct SeqList{ DataType* data; //DataType data[MAX]; int sz; //当前有效的个数 int capatity; //容量}SeqList,*pSeqList;void InitSeqList(pSeqList plist);//初始化顺序表void PushBack(pSeqList plist,DataType d);//从尾部插入数据void PopBack(pSeqList plist);//从尾部删除数据void PushFront(pSeqList plist,DataType d);//从头部插入数据void PopFront(pSeqList plist);//从头部删除数据int Find(pSeqList plist, DataType d);//查找指定数void Remove(pSeqList plist, DataType d);//指定元素删除void RemoveAll(pSeqList plist, DataType d);//删除指定的所有元素void Show(pSeqList plist);//打印顺序表void BubbleSort(pSeqList plist);//冒泡排序int BinarySearch(pSeqList plist, DataType d);//非递归实现二分查找int printSearch(pSeqList plist, int left, int right, DataType d);//递归实现二分查找void Insert(pSeqList plist, int pos, DataType d);//指定位置插入void ReverseList(pSeqList plist);//反向旋转void DestroySeqList(pSeqList plist);//清空动态顺序表void CheckSeqList(pSeqList plist);//判断动态顺的序表的空间是否已满,满的话进行扩容 #endif
list.c#include"test.h"void CheckSeqList(pSeqList plist){ if (plist->sz==plist->capatity) { DataType *tmp = (DataType *)realloc(plist->data, (plist->capatity + ISC_SZ)*sizeof(SeqList)); if(tmp == NULL) { perror("realloc"); return; } plist->data= tmp; plist->capatity += ISC_SZ; }}void InitSeqList(pSeqList plist){ plist->data = (DataType *)malloc(sizeof(pSeqList)*DEFAULT_SZ); if (plist->data == NULL) { perror("malloc"); return; } plist->sz = 0; plist->capatity = 0; memset(plist->data, 0, sizeof(pSeqList)*DEFAULT_SZ);}void PushBack(pSeqList plist,DataType d){ assert(plist); CheckSeqList(plist); /*if (plist->sz == MAX) { printf("顺序表已满!\n"); return; }*/ plist->data[plist->sz] = d; plist->sz++;}void PopBack(pSeqList plist){ assert(plist); if (plist->data == NULL) { printf("顺序表为空!\n"); return; } plist->data[plist->sz - 1] = 0; plist->sz--;}void PushFront(pSeqList plist,DataType d){ int i = 0; assert(plist); /*if (plist->sz == MAX) { printf("顺序表已满!\n"); return; }*/ CheckSeqList(plist); for (i = plist->sz; i > 0; i--) { plist->data[i] = plist->data[i - 1]; } plist->data[0] = d; plist->sz++;}void PopFront(pSeqList plist){ int i = 0; assert(plist); if (plist->data == NULL) { printf("顺序表为空!\n"); return; } for (i = 0; i < plist->sz - 1; i++) { plist->data[i] = plist->data[i + 1]; } plist->sz--;}void Show(pSeqList plist){ int i = 0; assert(plist); for (i = 0; i < plist->sz; i++) { printf("%d ", plist->data[i]); }}int Find(pSeqList plist, DataType d){ int i = 0; assert(plist); for (i = 0; i < plist->sz; i++) { if (plist->data[i] == d) return i; } return -1;}void Remove(pSeqList plist, DataType d){ int pos=Find(plist,d); assert(plist); if (pos != -1) { int i = 0; for (i = pos; i < plist->sz-1; i++) { plist->data[i] = plist->data[i + 1]; } plist->sz--; }}void RemoveAll(pSeqList plist, DataType d){ int pos = Find(plist, d); assert(plist); while ( pos!= -1) { int i = 0; for (i = pos; i < plist->sz - 1; i++) { plist->data[i] = plist->data[i + 1]; } plist->sz--; pos = Find(plist, d); }}void BubbleSort(pSeqList plist){ int i = 0; int j = 0; assert(plist); for (i = 0; i < plist->sz; i++) { for (j = 0; j < plist->sz - i - 1; j++) { if (plist->data[j]>plist->data[j + 1]) { int tmp = plist->data[j]; plist->data[j] = plist->data[j + 1]; plist->data[j + 1] = tmp; } } }}int BinarySearch(pSeqList plist, DataType d){ int left = 0; int right = plist->sz - 1; assert(plist); while (left <= right) { int mid = (left + right) / 2; if (plist->data[mid] > d) { right = mid - 1; } else if (plist->data[mid] < d) { left = mid + 1; } else if (plist->data[mid] == d) { return mid; } } return -1;}void Insert(pSeqList plist, int pos, DataType d){ int i = 0; assert(plist); CheckSeqList(plist); for (i = plist->sz - 1; i>pos;i--) { plist->data[i] = plist->data[i - 1]; } plist->data[pos] = d;}void ReverseList(pSeqList plist){ assert(plist); int left = 0; int right = plist->sz - 1; while (left < right) { int tmp = plist->data[left]; plist->data[left] = plist->data[right]; plist->data[right] = tmp; left++; right--; }}void DestroySeqList(pSeqList plist){ free(plist->data); plist->data = NULL;}int printSearch(pSeqList plist, int left, int right, DataType d){ assert(plist); while (left <= right) { int mid = (left + right) / 2; if (plist->data[mid] > d) { return printSearch(plist, left, mid - 1, d); } else if (plist->data[mid] < d) { return printSearch(plist, mid + 1 , right, d); } else if (plist->data[mid] == d) { return mid; } } return -1;}
test.c#include"test.h"extern struct SeqList sz;void test1(){ SeqList list; int tmp = 0; InitSeqList(&list); PushBack(&list, 1); PushBack(&list, 2); PushBack(&list, 3); PushBack(&list, 4); PopBack(&list); PushFront(&list, 7); PushFront(&list, 6); PushFront(&list, 5); PopFront(&list); Remove(&list, 6); PushBack(&list, 2); PushFront(&list, 2); RemoveAll(&list, 2); PushBack(&list, 4); PushFront(&list, 5); PushBack(&list, 8); PushFront(&list, 0); BubbleSort(&list); Insert(&list, 2, 12); /*tmp = BinarySearch(&list, 5); printf("%d\n", tmp);*/ /*tmp = Find(&list, 6); printf("%d",tmp);*/ Show(&list);}void test2(){ SeqList list; int tmp = 0; InitSeqList(&list); PushBack(&list, 1); PushBack(&list, 2); PushBack(&list, 3); PushBack(&list, 4); ReverseList(&list); tmp = printSearch(&list,0, list.sz, 4); printf("%d\n", tmp); Show(&list);}int main(){ /*test1();*/ test2(); system("pause"); return 0;}
0 0
- 【顺序表】用c语言简单实现顺序表
- 简单顺序表 C语言实现
- C语言顺序表的简单实现
- c语言实现简单顺序表
- C语言简单实现动态顺序表
- C语言实现顺序表
- 顺序表c语言实现
- c语言实现顺序表
- C语言实现顺序表
- C语言实现顺序表
- C语言实现顺序表
- C语言实现顺序表
- C语言实现顺序表
- C语言实现顺序表
- C语言实现顺序表
- c语言实现顺序表
- C语言实现顺序表
- C语言实现顺序表
- C/C++之NULL、0、nullptr详解
- 1026.Table Tennis (30)...to be continued...
- iOS 父视图半透明问题
- codeforce round 399# B
- Easyui笔记4:实现表格内combobox数据的动态切换(getEditor的使用)
- 【顺序表】用c语言简单实现顺序表
- 细菌实验分组(C程序设计进阶 第2周)
- 九度OJ-1449:确定比赛名次
- 平和心态
- 51单片机之入门准备
- MapReduce实现KMeans
- 阿里巴巴温少写的 Maven整合SpringMVC+Spring+Hibernate pom.xml
- Android使用百度地图SDK实现定位功能
- 数据结构mooc学习