SeqList.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#define MAX 10
typedef int DataType;
typedef struct SeqList
{
DataType data[MAX];
int sz;
}SeqList, *pSeqList;
void InitSeqList(pSeqList ps);
void PushBack(pSeqList ps, DataType d);
void PopBack(pSeqList ps);
void Display(const pSeqList ps);
void PushFront(pSeqList ps, DataType d);
void PopFront(pSeqList ps);
int Find(pSeqList ps, DataType d);
void Insert(pSeqList ps, DataType d, int pos);
void Remove(pSeqList ps, DataType d);
void RemoveAll(pSeqList ps, DataType d);
void Reverse(pSeqList ps);
void Sort(pSeqList ps);
int BinarySearch(pSeqList ps, DataType d);
#endif //__SEQLIST_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
void InitSeqList(pSeqList ps)//初始化
{
assert(ps);
ps->sz = 0;
memset(ps->data, 0, sizeof(DataType)*MAX);
}
void PushBack(pSeqList ps, DataType d)//尾插
{
assert(ps);
if (ps->sz == MAX)
{
printf("顺序表已满,不能继续插入!\n");
exit(EXIT_FAILURE);
}
ps->data[ps->sz] = d;
ps->sz++;
/*printf("尾插成功!\n");*/
}
void PopBack(pSeqList ps)//尾删
{
assert(ps);
if (ps->sz == 0)
{
printf("顺序表已为空,不可删除!\n");
exit(EXIT_FAILURE);
}
ps->sz--;
/*printf("尾删成功!\n");*/
}
void Display(const pSeqList ps)//打印
{
assert(ps);
int i = 0;
for (i = 0; i < ps->sz; i++)
{
printf("%d ", ps->data[i]);
}
printf("\n");
}
void PushFront(pSeqList ps, DataType d)//头插
{
int i = 0;
assert(ps);
if (ps->sz == MAX)
{
printf("顺序表已满,不能继续插入!\n");
exit(EXIT_FAILURE);
}
//从后往前
for (i = ps->sz; i >= 0; i--)
{
ps->data[i+1] = ps->data[i];
}
ps->data[0] = d;
ps->sz++;
/*printf("头插成功!\n");*/
}
void PopFront(pSeqList ps)//头删
{
int i = 0;
assert(ps);
if (ps->sz == 0)
{
printf("顺序表已为空,不可删除!\n");
exit(EXIT_FAILURE);
}
//从前往后删除
for (i = 0; i < ps->sz; i++)
{
ps->data[i] = ps->data[i + 1];
}
ps->sz--;
/*printf("头删成功!\n");*/
}
int Find(pSeqList ps, DataType d)//查找d是否在顺序表中,是,返回下标,不是,返回-1
{
int i = 0;
assert(ps);
for (i = 0; i < ps->sz; i++)
{
if (ps->data[i] == d)
{
return i;
}
}
return -1;
}
void Insert(pSeqList ps, DataType d, int pos)//在给定位置插入元素
{
assert(ps);
if (ps->sz == MAX)
{
printf("顺序表已满,不能继续插入!\n");
exit(EXIT_FAILURE);
}
memmove(ps->data + pos + 1, ps->data + pos, sizeof(DataType)* (ps->sz - pos));
ps->data[pos] = d;
ps->sz++;
}
void Remove(pSeqList ps, DataType d)//删除给定元素
{
int pos = Find(ps, d);
assert(ps);
if (pos!=-1)
{
memmove(ps->data + pos , ps->data + pos+1, sizeof(DataType)*(ps->sz - pos-1));
ps->sz--;
}
/*printf("删除成功!\n");*/
}
void RemoveAll(pSeqList ps, DataType d)//删除所有给定元素
{
int i = 0;
int pos = 0;
assert(ps);
if (ps->sz == 0)
{
printf("顺序表已为空,不可删除!\n");
exit(EXIT_FAILURE);
}
while (pos != -1)
{
Remove(ps, d);
pos = Find(ps, d);
}
}
void Reverse(pSeqList ps)//逆序
{
int i = 0;
DataType tmp = 0;
assert(ps);
for (i = 0; i < ps->sz; i++)
{
tmp = ps->data[ps->sz - 1];
ps->data[ps->sz - 1] = ps->data[i];
ps->data[i] = tmp;
}
}
void Sort(pSeqList ps)
{
int i = 0;
int j = 0;
DataType tmp = 0;
assert(ps);
for (i = 0; i < ps->sz - 1; i++)
{
for (j = 0; j < ps->sz - i - 1; j++)
{
if (ps->data[j]>ps->data[j + 1])
{
tmp = ps->data[j];
ps->data[j] = ps->data[j + 1];
ps->data[j + 1] = tmp;
}
}
}
}
int BinarySearch(pSeqList ps, DataType d)
{
int left = 0;
int right = ps->sz - 1;
int mid = 0;
assert(ps);
while (left <= right)
{
mid = (left + right) >> 1;
if (ps->data[mid] == d)
{
return mid;
}
else if (d < ps->data[mid])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return -1;
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
test()
{
SeqList my_list;
InitSeqList(&my_list);//初始化
PushBack(&my_list, 1);//尾插1,2,3
PushBack(&my_list, 2);
PushBack(&my_list, 3);
Display(&my_list);//打印
PopBack(&my_list);//尾删3
Display(&my_list);//打印
PushFront(&my_list, 5);//头插5,6,7
PushFront(&my_list, 6);
PushFront(&my_list, 7);
Display(&my_list);//打印
PopFront(&my_list);//头删5
PopFront(&my_list);//头删6
PopFront(&my_list);//头删7
Display(&my_list);//打印
int pos=Find(&my_list, 2);//查找
if (pos == -1)
{
printf("没有找到!\n");
}
else
{
printf("下标为:");
printf("%d ", pos);
printf("找到了\n");
}
Insert(&my_list, 6, 2);//在下标为2的位置插入6
Display(&my_list);//打印
Remove(&my_list, 2);//删除2
PushBack(&my_list, 1);//尾插1,2,3
PushBack(&my_list, 2);
Display(&my_list);
RemoveAll(&my_list,1);//删除所有指定元素
Display(&my_list);
Reverse(&my_list);//逆序
Display(&my_list);
PushFront(&my_list, 5);//头插5,6,7
PushFront(&my_list, 6);
PushFront(&my_list, 7);
Sort(&my_list);//排序
Display(&my_list);
int mid=BinarySearch(&my_list, 7);
if (mid == -1)
{
printf("没有找到!\n");
}
else
{
printf("下标为:");
printf("%d ", mid);
printf("找到了\n");
}
}
int main()
{
test();
system("pause:");
return 0;
}