本文主要实现静态顺序表基本功能:初始化、插入(头插、尾插、任意位置插入)、删除(头删、尾删、任意位置删除,删除指定元素、删除所有指定元素)、排序(冒泡排序)、逆序、查找(二分查找)
//静态顺序表结构
#define MAX 100 //顺序表能存储的最大数目的元素个数
typedef int DataType;
typedef struct SeqList
{
DataType list[MAX]; //顺序表
int size; //存储数量
}SeqList,*pSeqList;
主要功能接口如下:
void InitSeqList(pSeqList pseq);//初始化顺序表 void PrintSeqList(SeqList seq);//打印顺序表内容 void PushBack(pSeqList pseq, DataType x);//尾部插入元素 void PopBack(pSeqList pseq);//尾部删除元素 void PushFront(pSeqList pseq, DataType x);//头插 void PopFront(pSeqList pseq);//头删 void Insert(pSeqList pseq,int pos,DataType x);//插入元素 void Remove(pSeqList pseq, DataType x);//删除指定元素 void RemoveAll(pSeqList pseq, DataType x);//删除顺序表中所有的指定元素 int Find(SeqList Seq, int pos, DataType x);//按位置开始查找元素 void ReverseList(pSeqList Seq);//顺序表逆序 void SortSeqList(pSeqList pseq);//顺序表排序 int BinarySearch(pSeqList pseq,DataType x);//二分查找
函数的实现:
void InitSeqList(pSeqList pseq) { memset(pseq->list, 0, sizeof(pseq->list)); pseq->size = 0; } void PrintSeqList(SeqList seq) { int i = 0; for (i = 0; i < seq.size; i++) { printf("%d ", seq.list[i]); } } void PushBack(pSeqList pseq, DataType x) { if (pseq->size == MAX) { printf("顺序表已满\n"); } else { pseq->list[pseq->size] = x; pseq->size++; } } void PopBack(pSeqList pseq) { if (pseq->size == 0) { printf("顺序表为空\n"); } else { pseq->size--; } } void PushFront(pSeqList pseq, DataType x) { int i = 0; if (pseq->size == MAX) { printf("顺序表已满\n"); } else { for (i = pseq->size; i > 0; i--) { pseq->list[i] = pseq->list[i - 1]; } pseq->list[0] = x; pseq->size++; } } void PopFront(pSeqList pseq) { int i = 0; if (pseq->size == 0) { printf("顺序表为空\n"); } else { for (i = 0; i < pseq->size; i++) { pseq->list[i] = pseq->list[i + 1]; } pseq->size--; } } void Insert(pSeqList pseq, int pos, DataType x) { int i = 0; if (pseq->size == MAX) { printf("顺序表已满\n"); } else { for (i = pseq->size; i > pos; i--) { pseq->list[i] = pseq->list[i - 1]; } pseq->list[pos] = x; pseq->size++; } } int Find(SeqList Seq,int pos, DataType x) { int i = 0; for (i = pos; i < Seq.size; i++) { if (Seq.list[i] == x) { return i; } } return -1; } void Remove(pSeqList pseq, DataType x) { int i = 0; int pos = Find(*pseq,0, x); if (pos!=-1) { for (i = pos; i < pseq->size; i++) { pseq->list[i] = pseq->list[i + 1]; } pseq->size--; } else printf("not exit\n"); } void RemoveAll(pSeqList pseq, DataType x) { int pos = 0; int i = 0; pos = Find(*pseq, pos, x); if (pos == -1) { printf("not exit\n"); return; } while (pos!=-1) { for (i = pos; i < pseq->size; i++) { pseq->list[i] = pseq->list[i + 1]; } pseq->size--; pos = Find(*pseq, pos, x); } } void ReverseList(pSeqList pSeq) { int start = 0; int end = pSeq->size - 1; int tmp = 0; while (start < end) { tmp = pSeq->list[start]; pSeq->list[start] = pSeq->list[end]; pSeq->list[end] = tmp; start++; end--; } } void SortSeqList(pSeqList pseq) { int i = 0; int j = 0; int tmp = 0; int flag = 0; for (i = 0; i < pseq->size; i++) { flag = 0; for (j = 0; j < pseq->size-i-1; j++) { if (pseq->list[j] > pseq->list[j+1]) { tmp = pseq->list[j]; pseq->list[j] = pseq->list[j+1]; pseq->list[j + 1] = tmp; flag = 1; } } if (flag == 0) { break; } } } int BinarySearch(pSeqList pseq, DataType x) { int left = 0; int right = pseq->size - 1; while (left <= right) { int mid = left - ((left - right) >>1); if (pseq->list[mid] > x) { right = mid-1; } else if (pseq->list[mid] < x) { left = mid + 1; } else return mid; } return -1; }