C语言实现了个静态的顺序表,如果有不对的地方,还请指正
SeqList.h
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
typedef int DataType;
#define N 100
typedef struct SeqList{
DataType arr[N]; //数组存储元素最大值为N
size_t len; //数组当前长度
}SeqList,*pSeqList;
void InitSeqList(pSeqList plist);//初始化顺序表
void PushBack(pSeqList plist, DataType x);//尾插
void PopBack(pSeqList plist);//尾删
void PushFront(pSeqList plist, DataType x);//头插
void PopFront(pSeqList plist);//头删
void Display(pSeqList plist);//遍历
void ReverseSeqList(pSeqList plist);//逆置
void Insert(pSeqList plist, size_t pos, DataType x);//指定位置插入
void Erase(pSeqList plist, size_t pos);//删除指定位置的数据
void Remove(pSeqList plist, DataType x);//删除表中第一个值为x的数据
void RemoveAll(pSeqList plist, DataType x);//删除表中所有值为x的数据
void Bubble_Sort(pSeqList plist);//冒泡排序
void Select_Sort(pSeqList plist);//选择排序
int Binary_Search(pSeqList plist, DataType x);//二分查找
#endif //_SEQLIST_H_
下面是SeqList.c
#include "SeqList.h"
#pragma once
void InitSeqList(pSeqList plist)//初始化顺序表
{
assert(plist);
memset(plist->arr, 0, sizeof(DataType)* N);
plist->len = 0;
}
void PushBack(pSeqList plist, DataType x)//尾插
{
assert(plist);
if (plist->len == N)
{
printf("SeqList is full! \n");
return;
}
plist->arr[plist->len++] = x;
}
void PopBack(pSeqList plist)//尾删
{
assert(plist);
if (plist->len == 0)
{
printf("SeqList is empty! \n");
return;
}
else
{
plist->arr[plist->len - 1] = 0;
plist->len--;
}
}
void PushFront(pSeqList plist, DataType x)//头插
{
assert(plist);
if (plist->len == N)
{
printf("SeqList is full! \n");
return;
}
int end = plist->len-1; //最后一个元素的下标
for (; end >= 0; end--)
{
plist->arr[end+1] = plist->arr[end];
}
plist->arr[0] = x;
plist->len++;
}
void PopFront(pSeqList plist) //头删
{
assert(plist);
size_t i = 0;
if (plist->len == 0)
{
printf("SeqList is empty! \n");
return;
}
for (i = 1; i < plist->len; i++)
{
plist->arr[i - 1] = plist->arr[i];
}
plist->len--;
}
void Display(pSeqList plist)//遍历
{
assert(plist);
size_t i = 0;
for (i = 0; i < plist->len; i++)
{
printf("%d ",plist->arr[i]);
}
printf("\n");
}
void ReverseSeqList(pSeqList plist)//逆置
{
assert(plist);
int left = 0;
int right = plist->len - 1;
int tmp = 0;
while (left < right)
{
tmp = plist->arr[left];
plist->arr[left] = plist->arr[right];
plist->arr[right] = tmp;
left++;
right--;
}
}
void Insert(pSeqList plist, size_t pos, DataType x)//指定位置插入
{
assert(plist);
assert(pos < plist->len);
if (plist->len == N)
{
printf("SeqList is full! \n");
return;
}
size_t end = plist->len - 1;
for (; end >= pos; end--)
{
plist->arr[end + 1] = plist->arr[end];
}
plist->arr[pos] = x;
plist->len++;
}
void Erase(pSeqList plist, size_t pos)//删除指定位置的数据
{
assert(plist);
assert(pos < plist->len);
while (pos < plist->len - 1)
{
plist->arr[pos] = plist->arr[pos + 1];
pos++;
}
plist->len--;
}
void Remove(pSeqList plist, DataType x)//删除表中第一个值为x的数据
{
assert(plist);
size_t i = 0;
for (; i < plist->len; i++)
{
if (plist->arr[i] == x)
{
Erase(plist,i);
return;
}
}
}
void RemoveAll(pSeqList plist, DataType x)//删除表中所有值为x的数据
{
assert(plist);
size_t i = 0;
for (; i < plist->len; i++)
{
if (plist->arr[i] == x)
{
Erase(plist,i);
i--; //必须i--,因为在调用Erase函数时,i下标处元素被删除,后面的元素往前挪了一个格,plist->arr[i]存储的是i+1的元素;
} //如果没有i--,for循环会使i+1位置元素没有被遍历到,顺序表的元素减少了一位,遍历到最后一个元素处,会造成越界
}
}
void Bubble_Sort(pSeqList plist)//冒泡排序
{
assert(plist);
size_t i = 0;
size_t j = 0;
for (i = 0; i < plist->len; i++)
{
for (j = 0; j < plist->len - 1; j++)
{
if (plist->arr[j]>plist->arr[j + 1])
{
int tmp = plist->arr[j];
plist->arr[j] = plist->arr[j + 1];
plist->arr[j + 1] = tmp;
}
}
}
}
void Select_Sort(pSeqList plist)//选择排序
{
assert(plist); //就是先找一个最小的(升序),和第一个元素交换,在在剩下的里面找最小的和第二个元素交换,。。。。
size_t min = 0;
size_t index = 0;
size_t pos = 0;
for (index = 0; index < plist->len-1; index++)
{
min = index;
pos = index + 1;
//找出最值
while(pos < plist->len)
{
if (plist->arr[pos] < plist->arr[min])
{
min = pos;
}
pos++;
}
//交换
//Swap(plist->arr[index],plist->arr[min]);
if (min != index) //如果最小值的下标和要交换位置的下标不相等,就交换,相等就没必要交换
{
DataType tmp = plist->arr[index];
plist->arr[index] = plist->arr[min];
plist->arr[min] = tmp;
}
}
}
int Binary_Search(pSeqList plist, DataType x)//二分查找
{
assert(plist);
int left = 0;
int right = plist->len - 1;
int mid = 0;
int index = 0;
while (left < right)
{
int mid = left + ( (right - left) >> 1);
if (plist->arr[mid] < x )
{
left = mid + 1;
}
else if (plist->arr[mid] > x)
{
right = mid - 1;
}
else
{
while ((plist->arr[mid] == x) && (mid >= 0))
{
mid--; // [1 2 2 2 3 3 4 5 5 6 7] 比如 查找2,则返回第一个2的下标1
}
return mid + 1;
}
}
return -1;
}
void TestSeqList1()
{
int index;
SeqList seq;
pSeqList plist=&seq;
InitSeqList(plist);
PushBack(plist, 1);
PushBack(plist, 1);
PushBack(plist, 1);
PushBack(plist, 1);
PushBack(plist, 1);
PushBack(plist, 1);
PushBack(plist, 3);
PushBack(plist, 2);
PushBack(plist, 4);
//PushBack(plist, -1);
PushBack(plist, 6);
PushBack(plist, 5);
PushBack(plist, 9);
PushBack(plist, 7);
PushBack(plist, 8);
/*PopBack(plist);
PopBack(plist);
PopBack(plist);
PopBack(plist);
PopBack(plist);*/
PushFront(plist, 7);
PushFront(plist, 8);
PushFront(plist, 6);
Display(plist);
//RemoveAll(plist,7);
Erase(plist,5);
Display(plist);
//PopFront(plist);
//PopFront(plist);
//PopFront(plist);
//PopFront(plist);
//ReverseSeqList(plist);
//Insert(plist, 4, 9);
//Display(plist);
//Bubble_Sort(plist);
//Select_Sort(plist);
Select_Sort_OP(plist);
Display(plist);
/*index = Binary_Search(plist,1);
printf("%d\n",index);
Display(plist);*/
return;
}
接下来是test.c
#define _CRT_SECURE_NO_WARNING 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "SeqList.h"
int main()
{
TestSeqList1();
system("pause");
return 0;
}