#ifndef __SEQLIST_H__ #define __SEQLIST_H__ #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #define MAX 100 typedef int DataType; typedef struct Seqlist { DataType Data[MAX]; DataType sz; }Seqlist ,*pSeqlist; void PrintSeqlist(pSeqlist pSeq); //打印顺序表 void InitSeqlist(pSeqlist pSeq); //初始化顺序表 void PushBack(pSeqlist pSeq, DataType x); //从后面插入一个元素 void Popback(pSeqlist pSeq); //抛出最后面的 void PushFornt(pSeqlist pSeq,DataType x); //在头部插入一个元素 void PopFornt(pSeqlist pSeq); //删除头元素 void Insert(pSeqlist pSeq,int pos, DataType x); //指定位置插入 void Remove(pSeqlist pSeq, DataType x); //移除第一个出现的x void RemoveAll(pSeqlist pSeq, DataType x); //移除全部的x void Sort(pSeqlist pSeq); //排序顺序表 int BinarySearch(pSeqlist pSeq,DataType x); //二分查找,返回元素所在下标 #endif //__SEQLIST_H__ #include"seqlist.h" void PrintSeqlist(pSeqlist pSeq) { assert(pSeq); int i = 0; if (pSeq->sz == 0) //异常情况,表为空 { printf("表是空表\n"); } else { for (i = 0; i < pSeq->sz; i++) { printf("%d ",pSeq->Data[i]); } printf("\n"); } } void InitSeqlist(pSeqlist pSeq) { assert(pSeq); pSeq->sz = 0; } void PushBack(pSeqlist pSeq, DataType x) { assert(pSeq); if (pSeq->sz == MAX) //异常情况,表为满 { printf("表已满\n"); return; } pSeq->Data[pSeq->sz] = x; pSeq->sz++; } void Popback(pSeqlist pSeq) { assert(pSeq); if (pSeq->sz == 0) //异常情况,表为空 { printf("表已空\n"); return; } pSeq->sz--; } void PushFornt(pSeqlist pSeq, DataType x) { assert(pSeq); int i=0; if (pSeq->sz == MAX) //异常情况,表为满 { printf("表已满\n"); return; } for (i = pSeq->sz; i > 0; i--) { pSeq->Data[i] = pSeq->Data[i - 1]; } pSeq->Data[0] = x; pSeq->sz++; } void PopFornt(pSeqlist pSeq) { assert(pSeq); int i = 0; if (pSeq->sz ==0) //异常情况,表为空 { printf("表已空\n"); return; } for (i = 0; i< pSeq->sz-1; i++) { pSeq->Data[i] = pSeq->Data[i+1]; } pSeq->sz--; } void Insert(pSeqlist pSeq, int pos, DataType x) { assert(pSeq); int i = 0; if (pSeq->sz == MAX) //异常情况,表为满 { printf("表已满\n"); return; } if (pos > pSeq->sz&&pos<0) //插入位置小于0或者大于sz都是不合法,顺序表要求位置连续 { printf("插入位置不合法\n"); return; } for (i = pSeq->sz;i>pos; i--) { pSeq->Data[i] = pSeq->Data[i - 1]; } pSeq->Data[pos] = x; pSeq->sz++; } void Remove(pSeqlist pSeq, DataType x) { assert(pSeq); int i = 0; if (pSeq->sz == 0) //异常情况,表为空 { printf("表已空\n"); return; } while (i<pSeq->sz) { if (pSeq->Data[i] == x) { for (; i< pSeq->sz - 1; i++) { pSeq->Data[i] = pSeq->Data[i + 1]; } pSeq->sz--; break; } i++; } } void RemoveAll(pSeqlist pSeq, DataType x) { assert(pSeq); int i = 0; int j = 0; if (pSeq->sz == 0) //异常情况,表为空 { printf("表已空\n"); return; } while (i<=pSeq->sz) { if (pSeq->Data[i] == x) { for (j=i; j< pSeq->sz - 1; j++) { pSeq->Data[j] = pSeq->Data[j + 1]; } pSeq->sz--; } i++; } } void Sort(pSeqlist pSeq) { assert(pSeq); if (pSeq->sz == 0) //异常情况,表为空 { printf("表已空\n"); return; } int i = 0; int j = 0; int flag = 0; for (i = 0; i < pSeq->sz - 1;i++) { flag = 0; for (j = 0; j < pSeq->sz - i - 1; j++) { if (pSeq->Data[j]>pSeq->Data[j + 1]) { DataType tmp = pSeq->Data[j]; pSeq->Data[j] = pSeq->Data[j+1]; pSeq->Data[j+1] = tmp; flag = 1; } } if (flag == 0) break; } } int BinarySearch(pSeqlist pSeq, DataType x) { assert(pSeq); if (pSeq->sz == 0) //异常情况,表为空 { printf("表已空\n"); return -1; } int left = 0; int right = pSeq->sz-1; int mid = (left&right) + ((left^right)>>1); //mid取平均值 while (left<right) { if (x>pSeq->Data[mid]) { left = mid + 1; mid = (left&right) + ((left^right) >> 1); } else if (x<pSeq->Data[mid]) { right = mid -1; mid = (left&right) + ((left^right) >> 1); } else { printf("%d\n",mid); return mid; //返回这个元素所在的下标 } } return -1; } #include"seqlist.h" void menu() { printf("*********************************\n"); printf("0.exit 1.PrintSeqlist \n"); printf("2.InitSeqlist 3.PushBack \n"); printf("4.Popback 5.PushFornt \n"); printf("6.PopFornt 7.Insert \n"); printf("8.Remove 9.RemoveAll \n"); printf("10.Sort 11.BinarySearch\n"); printf("请输入:>"); } void test(pSeqlist pSeq) { DataType x = 0; int n = 0; int pos = 0; while (1) { menu(); scanf("%d", &n); switch (n) { case 0: exit(1); break; case 1: PrintSeqlist(pSeq); break; case 2: InitSeqlist(pSeq); break; case 3: printf("请输入元素\n"); scanf("%d", &x); PushBack(pSeq, x); break; case 4: Popback(pSeq); break; case 5: printf("请输入元素\n"); scanf("%d", &x); PushFornt(pSeq, x); break; case 6: PopFornt(pSeq); break; case 7: printf("请输入元素\n"); scanf("%d", &x); printf("请输入插入位置\n"); scanf("%d", &pos); Insert(pSeq, pos, x); break; case 8: printf("请输入元素\n"); scanf("%d", &x); Remove(pSeq, x); break; case 9: printf("请输入元素\n"); scanf("%d", &x); RemoveAll(pSeq, x); break; case 10: Sort(pSeq); break; case 11: printf("请输入元素\n"); scanf("%d", &x); BinarySearch(pSeq, x); break; default: printf("输入无效\n"); break; } } } int main() { Seqlist pSeq; memset(pSeq.Data, 0, sizeof(DataType)*MAX); pSeq.sz = 0; test(&pSeq); system("pause"); return 0; }