C语言顺序表的几种实现
2016-06-09 22:01
369 查看
</pre><br /><pre name="code" class="cpp">#pragma once #include <string.h> #include<assert.h> #define MAX_SIZE 1000 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE]; size_t size; }SeqList; void InitSeqList(SeqList* pSeq);//初始化 void PushBack(SeqList* pSeq, DataType x);//尾插 void PopBack(SeqList* pSeq);//尾删 void PushFront(SeqList* pSeq,DataType x);// 头插 void PopFront(SeqList* pSeq);//头删 void Insert(SeqList*pSeq, size_t pos, DataType x);//插入 int Find(SeqList* pSeq, size_t pos, DataType x);//查找 void Erase(SeqList* pSeq, size_t pos);//删除某个位置上的数据 int Remove(SeqList* pSeq, DataType x); void RemoveAll(SeqList* pSeq, DataType x); void BubbleSort(SeqList* pSeq);//冒泡排序 //一次选出最大最小的数据分别放在序列的两端 void SeclectSort(SeqList* pSeq);//选择排序 //int BinarySearch(SeqList* pSeq, DataType x)//二分查找 //{ // []左闭右闭 // int left = 0; // int right = pSeq->size - 1; // assert(pSeq); // // // while (left <= right) // { // /*int mid = (right + left) / 2;*/ // int mid = left + (right - left) / 2; // if (x > pSeq->array[mid]) // { // left = mid + 1; // } // else if (x < pSeq->array[mid]) // { // right = mid - 1; // } // else // { // return mid; // } // } // return -1; //} int BinarySearch(SeqList* pSeq, DataType x)//二分查找 { //[)左闭右开 int left = 0; int right = pSeq->size ; assert(pSeq); while (left < right) { /*int mid = (right + left) / 2;*/ int mid = left + (right - left) / 2; if (x > pSeq->array[mid]) { left = mid + 1; } else if (x < pSeq->array[mid]) { right = mid ; } else { return mid; } } return -1; } void PrintSeqList(SeqList*pSeq);//打印 void InitSeqList(SeqList* pSeq)//初始化链表 { assert(pSeq); memset(pSeq->array, 0, sizeof(DataType)*MAX_SIZE); pSeq->size = 0; } //1,检查参数 //2.边界条件的检查 静态顺序表容量有限 //3.完成我们的功能逻辑 void PushBack(SeqList* pSeq, DataType x)//尾插 { //assert(pSeq); //if (pSeq->size >= MAX_SIZE) //{ // printf("SeqList is Full\n"); // return; //} //pSeq->array[pSeq->size++] = x; Insert(pSeq, pSeq->size, x); } void PushFront(SeqList* pSeq, DataType x)//头插 { //int begin = pSeq->size - 1; //assert(pSeq); //if (pSeq->size >= MAX_SIZE) //{ // printf("SeqList is Full\n"); // return; //} //for (; begin >= 0;--begin) //{ // pSeq->array[begin + 1] = pSeq->array[begin]; //} //pSeq->array[0] = x; //++pSeq->size; Insert(pSeq, 0, x); } void PopBack(SeqList* pSeq)//尾删 { assert(pSeq); if (pSeq->size <= 0) { printf("SeqList is Empty\n"); return; } //pSeq->array[--pSeq->size] = 0; --pSeq->size; } void PopFront(SeqList* pSeq)//头删 { int begin = 1; assert(pSeq); if (pSeq->size <= 0) { printf("SeqList is Empty\n"); return; } for (; begin < pSeq->size; ++begin) { pSeq->array[begin - 1] = pSeq->array[begin]; } --pSeq->size; } void Insert(SeqList*pSeq, size_t pos, DataType x)//插入 { int begin = pSeq->size - 1; assert(pSeq); assert(pos <= pSeq->size); if (pSeq->size >= MAX_SIZE)//检查是否为空 { printf("SeqList is Full\n"); return; } for (; begin >= (int)pos; --begin) { pSeq->array[begin + 1] = pSeq->array[begin]; } pSeq->array[pos] = x; ++pSeq->size; } int Find(SeqList* pSeq, size_t pos, DataType x)//查找 { int i = pos; assert(pSeq); for (; i < pSeq->size; ++i) { if (pSeq->array[i] == x) { return i; } } return -1; } void Erase(SeqList* pSeq, size_t pos)//删除某个位置上的数据 { int begin = pos + 1; assert(pSeq); if (pSeq->size <= 0) { printf("SeqList is Empty\n"); return; } assert(pos < pSeq->size); for (; begin < pSeq->size; ++begin) { pSeq->array[begin - 1] = pSeq->array[begin]; } --pSeq->size; } int Remove(SeqList* pSeq, DataType x) { int pos; assert(pSeq); pos = Find(pSeq,0, x); if (pos != -1) { Erase(pSeq, pos); } return pos; } //void RemoveAll(SeqList* pSeq, DataType x) //{ // int pos; // assert(pSeq); // // pos = Find(pSeq,0, x); // while (pos != -1) // { // Erase(pSeq, pos); // pos = Find(pSeq,pos, x); // } //} void RemoveAll(SeqList* pSeq, DataType x) { int count = 0; int begin = 0; assert(pSeq); for (; begin < pSeq->size;++begin) { if (pSeq->array[begin] == x) { ++count; } else { pSeq->array[begin - count] = pSeq->array[begin]; } } pSeq->size -= count; } void PrintSeqList(SeqList*pSeq)//打印 { int i = 0; assert(pSeq); for (; i < pSeq->size; ++i) { printf(" %d", pSeq->array[i]); } printf("\n"); }
#define _CRT_SECURE_NO_WARNINGS 1 #include"SeqList.h" //InitSeqList/PushBack/PopBack void Test1() { <span style="white-space:pre"> </span>SeqList seq; <span style="white-space:pre"> </span>InitSeqList(&seq); <span style="white-space:pre"> </span>PushBack(&seq, 1); <span style="white-space:pre"> </span>PushBack(&seq, 2); <span style="white-space:pre"> </span>PushBack(&seq, 3); <span style="white-space:pre"> </span>PushBack(&seq, 4); <span style="white-space:pre"> </span>PrintSeqList(&seq); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>//PopBack(&seq); <span style="white-space:pre"> </span>//PopBack(&seq); <span style="white-space:pre"> </span>//PopBack(&seq); <span style="white-space:pre"> </span>//PopBack(&seq); <span style="white-space:pre"> </span>//PopBack(&seq); <span style="white-space:pre"> </span>//PrintSeqList(&seq); } //InitSeqList/PushFront/PopFront void Test2() { <span style="white-space:pre"> </span>SeqList seq; <span style="white-space:pre"> </span>InitSeqList(&seq); <span style="white-space:pre"> </span>PushBack(&seq, 1); <span style="white-space:pre"> </span>PushBack(&seq, 2); <span style="white-space:pre"> </span>PushBack(&seq, 3); <span style="white-space:pre"> </span>PushBack(&seq, 4); <span style="white-space:pre"> </span>PushFront(&seq, 0); <span style="white-space:pre"> </span>PrintSeqList(&seq); <span style="white-space:pre"> </span>PopFront(&seq); <span style="white-space:pre"> </span>PopFront(&seq); <span style="white-space:pre"> </span>PopFront(&seq); <span style="white-space:pre"> </span>PopFront(&seq); <span style="white-space:pre"> </span>PopFront(&seq); <span style="white-space:pre"> </span>PopFront(&seq); <span style="white-space:pre"> </span>PrintSeqList(&seq); } //Insert void Test3() { <span style="white-space:pre"> </span>SeqList seq; <span style="white-space:pre"> </span>InitSeqList(&seq); <span style="white-space:pre"> </span>PushBack(&seq, 1); <span style="white-space:pre"> </span>PushBack(&seq, 2); <span style="white-space:pre"> </span>PushBack(&seq, 4); <span style="white-space:pre"> </span>PushBack(&seq, 5); <span style="white-space:pre"> </span>Insert(&seq, 2, 3); <span style="white-space:pre"> </span>PrintSeqList(&seq); } void Test4() { <span style="white-space:pre"> </span>int ret; <span style="white-space:pre"> </span>SeqList seq; <span style="white-space:pre"> </span>InitSeqList(&seq); <span style="white-space:pre"> </span>PushBack(&seq, 1); <span style="white-space:pre"> </span>PushBack(&seq, 2); <span style="white-space:pre"> </span>PushBack(&seq, 3); <span style="white-space:pre"> </span>PushBack(&seq, 2); <span style="white-space:pre"> </span>PushBack(&seq, 2); <span style="white-space:pre"> </span>PrintSeqList(&seq); <span style="white-space:pre"> </span>//Remove(&seq, 3); <span style="white-space:pre"> </span>//PrintSeqList(&seq); <span style="white-space:pre"> </span>RemoveAll(&seq, 2); <span style="white-space:pre"> </span>PrintSeqList(&seq); } void Test5() { <span style="white-space:pre"> </span>int ret; <span style="white-space:pre"> </span>SeqList seq; <span style="white-space:pre"> </span>InitSeqList(&seq); <span style="white-space:pre"> </span>PushBack(&seq, 1); <span style="white-space:pre"> </span>PushBack(&seq, 2); <span style="white-space:pre"> </span>PushBack(&seq, 3); <span style="white-space:pre"> </span>PushBack(&seq, 4); <span style="white-space:pre"> </span>PushBack(&seq, 5); <span style="white-space:pre"> </span>PrintSeqList(&seq); <span style="white-space:pre"> </span>ret = BinarySearch(&seq, 1); <span style="white-space:pre"> </span>printf("ret?%d", ret); <span style="white-space:pre"> </span>ret = BinarySearch(&seq, 2); <span style="white-space:pre"> </span>printf("ret?%d", ret); <span style="white-space:pre"> </span>ret = BinarySearch(&seq, 3); <span style="white-space:pre"> </span>printf("ret?%d", ret); <span style="white-space:pre"> </span>ret = BinarySearch(&seq, 4); <span style="white-space:pre"> </span>printf("ret?%d", ret); <span style="white-space:pre"> </span>ret = BinarySearch(&seq, 5); <span style="white-space:pre"> </span>printf("ret?%d", ret); <span style="white-space:pre"> </span>printf("\n"); } int main() { <span style="white-space:pre"> </span>//Test1(); <span style="white-space:pre"> </span>//Test2(); <span style="white-space:pre"> </span>//Test3(); <span style="white-space:pre"> </span>//Test4(); <span style="white-space:pre"> </span>Test5(); <span style="white-space:pre"> </span>system("pause"); <span style="white-space:pre"> </span>return 0; }
相关文章推荐
- L1-020. 帅到没朋友
- C/C++程序设计题 机器人擂台赛
- C语言基础-函数getchar和函数scanf小结
- 【每天学一点】C++基础01
- c点滴
- C/C++杂记:虚函数的实现的基本原理
- 一起talk C栗子吧(第一百六十三回:C语言实例--三目运算符)
- c练习
- 初识C++继承
- 虚表探索
- c语言小知识点总结
- Valid Palindrome
- c++中怎样把字符转换为整型
- Linked List Cycle
- C++之派生类的拷贝构造与赋值运算符重载
- 基类与派生类访问(模板与非模板)
- 【C语言从入门到懵逼】#1 简单入门
- [转]观察者模式的C++范例
- winsock2 错误处理
- C++之类简介