顺序表经典面试题
来源:互联网 发布:php重庆招聘贴吧 编辑:程序博客网 时间:2024/06/05 07:11
头文件如下:
#include<stdio.h>#include<windows.h>#include<assert.h>#ifndef _SEQLIST_H_#define _SEQLIST_H_// 实现顺序表的以下接口typedef int DataType;#define MaxSize 10typedef struct SeqList{ DataType array[MaxSize]; int size; // 有效数据元素的个数}SeqList;//////////////////////////////////////// 初始化顺序表void InitSeqList(SeqList* pSeq);// 在顺序表的尾部插入值为data的元素void PushBack(SeqList* pSeq, DataType _data);// 删除顺序表的最后一个元素void PopBack(SeqList* pSeq);// 在顺序表的头部插入值为data的元素void PushFront(SeqList* pSeq, DataType data);// 删除顺序表头部元素void PopFront(SeqList* pSeq);// 在顺序表中pos位置上插入值为data的元素void Insert(SeqList* pSeq, size_t pos, DataType data);// 删除顺序表中pos位置上的元素void Erase(SeqList* pSeq, size_t pos);// 在顺序表中查找值为data的元素,找到返回该元素的位置,否则返回-1int Find(SeqList* pSeq, DataType data);// 删除顺序表中第一个值为data的元素void Remove(SeqList* pSeq, DataType data);// 删除顺序表中所有值为data的元素void RemoveAll(SeqList* pSeq, DataType data);// 使用冒泡排序给顺序表中的元素排序void BubbleSort(SeqList* pSeq);// 使用选择排序给顺序表中的元素排序void SelectSort(SeqList* pSeq);// 使用二分查找在顺序表中查找值为dataint BinarySearch(SeqList* pSeq, DataType data);//打印顺序表中所有元素void ShowSeqList(SeqList* pSeq);#endif
实现源文件:
#include"seqlist.h" //初始化顺序表void InitSeqList(SeqList* pSeq){ assert(pSeq); memset(pSeq->array, 0, MaxSize*sizeof(DataType)); pSeq->size = 0;}// 在顺序表的尾部插入值为data的元素void PushBack(SeqList* pSeq, DataType _data){ assert(pSeq); if (pSeq->size > MaxSize) { return; } pSeq->array[pSeq->size] = _data; pSeq->size++;}// 删除顺序表的最后一个元素void PopBack(SeqList* pSeq){ if (NULL == pSeq || pSeq->size == 0) { return 0; } pSeq->size--;}// 在顺序表的头部插入值为data的元素void PushFront(SeqList* pSeq, DataType data){ int idx=0; assert(pSeq); if (pSeq->size > MaxSize) { return; } for (idx = pSeq->size - 1; idx >= 0; idx--) { pSeq->array[idx + 1] = pSeq->array[idx]; } pSeq->array[0] = data; pSeq->size++;}// 删除顺序表头部元素void PopFront(SeqList* pSeq){ int idx = 0; assert(pSeq); if (pSeq->size == 0) { return; } for (idx = 1; idx < pSeq->size; idx++) { pSeq->array[idx - 1] = pSeq->array[idx]; } pSeq->size--;}//打印顺序表中所有元素void ShowSeqList(SeqList* pSeq){ int idx = 0; assert(pSeq); for (idx; idx < pSeq->size; idx++) { printf("%d ", pSeq->array[idx]); } printf("\n");}// 在顺序表中pos位置上插入值为data的元素void Insert(SeqList* pSeq, size_t pos, DataType data){ int idx = 0; assert(pSeq); if (pos > MaxSize) { return; } for (idx =pSeq->size-1; idx >=pos; idx--) { pSeq->array[idx + 1] = pSeq->array[idx]; } pSeq->array[pos] = data; pSeq->size++;}// 删除顺序表中pos位置上的元素void Erase(SeqList* pSeq, size_t pos){ int idx = 0; assert(pSeq); if (pSeq->size == 0) { return; } for (idx = pos; idx < pSeq->size; idx++) { pSeq->array[idx] = pSeq->array[idx + 1]; } pSeq->size--;}// 在顺序表中查找值为data的元素,找到返回该元素的位置,否则返回-1int Find(SeqList* pSeq, DataType data){ int idx = 0; assert(pSeq); for (idx = 0; idx < pSeq->size; idx++) { if (pSeq->array[idx] == data) { return 1; } } return -1;}// 删除顺序表中第一个值为data的元素void Remove(SeqList* pSeq, DataType data){ int idx = 0; assert(pSeq); for (idx = 0; idx < pSeq->size; idx++) { if (pSeq->array[idx] == data) { for (idx ; idx < pSeq->size-1; idx++) { pSeq->array[idx] = pSeq->array[idx + 1]; } pSeq->size--; return; } }}// 删除顺序表中所有值为data的元素void RemoveAll(SeqList* pSeq, DataType data){ int idx = 0; int idz = 0; assert(pSeq); for (idx = 0; idx < pSeq->size; idx++) { if (pSeq->array[idx] == data) { for (idz=idx; idz < pSeq->size-1; idz++) { pSeq->array[idz] = pSeq->array[idz + 1]; } pSeq->size--; idx--; } }}// 使用冒泡排序给顺序表中的元素排序void BubbleSort(SeqList* pSeq){ int i = 0, j = 0; int flag = 0; assert(pSeq); for (j = 0; j < pSeq->size; j++) { flag = 0; for (i = j+1; i < pSeq->size; i++) { if (pSeq->array[i]>pSeq->array[j]) { pSeq->array[i] ^= pSeq->array[j]; pSeq->array[j] ^= pSeq->array[i]; pSeq->array[i] ^= pSeq->array[j]; flag = 1; } } if (flag != 0) { return; } }}// 使用选择排序给顺序表中的元素排序void SelectSort(SeqList* pSeq){ int i = 0, j = 0; assert(pSeq); for (i = 0; i < pSeq->size; i++) { for (j = i+1; j < pSeq->size; j++) { if (pSeq->array[j]>pSeq->array[i]) { i = j; } } }}// 使用二分查找降序排列中的元素int BinarySearch(SeqList* pSeq, DataType data){ int left = 0, mid = (p->size)/2,right=p->size-1; assert(pSeq); while (left < right) { if (data < pSeq->array[mid]) { left = mid++; } else if (data>pSeq->array[mid]) { right = mid--; } else { return 1; } mid = (left + right) / 2; } return -1;}int main(){ SeqList mylist; InitSeqList(&mylist); PushBack(&mylist, 1); PushBack(&mylist, 2); ShowSeqList(&mylist); //PopFront(&mylist); ShowSeqList(&mylist); //PushFront(&mylist, 6); ShowSeqList(&mylist); PushBack(&mylist, 3); PushBack(&mylist, 4); PushBack(&mylist, 5); PushBack(&mylist, 6); Insert(&mylist, 5, 9); //ShowSeqList(&mylist); Erase(&mylist, 5); printf("%d", Find(&mylist, 5)); PushBack(&mylist, 6); PushBack(&mylist, 6); PushBack(&mylist, 6);// Remove(&mylist, 6); RemoveAll(&mylist, 6); return 0;}
0 0
- 顺序表经典面试题
- 顺序打印ABC------java多线程的一道经典面试题
- 经典面试题:翻转英文句子中单词的顺序
- java经典面试题(类加载和初始化顺序)
- IBM经典面试题
- 经典面试题
- java经典面试题
- 经典面试题
- Java经典面试题
- 经典C++面试题
- [转贴]经典面试题
- IBM经典面试题
- .Net经典面试题
- C++经典面试题
- IBM经典面试题
- C++经典面试题
- [转贴]经典面试题
- 经典java面试题
- MySQL最基本查询语法图解
- 初级运维必备技能
- Python yield 使用浅析
- 进程间通信之消息队列通信
- valgrind 的使用简介
- 顺序表经典面试题
- Java日期格式转化
- 现代通信网复习资料(第三章:分组交换原理)
- 13.C++ 构造函数、析构函数
- 双线性插值算法ARM NEON优化
- [ASP.NET]Dapper小型ORM的使用
- iterator相关
- Android Studio 主题、字体大小的设置
- Java设计模式(8)结构型:代理模式