相关操作包括:
- 顺序表的初始化
- 顺序表的创建 (头插,尾插,中间插入数据)
- 顺序表的删除 (头删,尾删,中间删除数据)
- 查询顺序表数据
- 修改顺序表数据
- 顺序表数据排序
- 顺序表的销毁
具体的代码分成三个部分,分别是:
1.seqlist.h(用来存放函数的头文件,声明函数)
2.seqlist.c (存放顺序表中用到的具体函数)
3.test.c (用来测试顺序表各种函数运行后的结果)
seqlist.h部分
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#ifndef _SEQLIST_H__
#define _SEQLIST_H__
#define MAX_NUM 100
//#define DataType int
typedef int DataType;
typedef struct seqlist
{
DataType arr[MAX_NUM];
int size;
}seqlist; //结构体重定义,seqlist是结构体的类型
void SeqInit(seqlist *qseq); // 初始化顺序表
void PushBack(seqlist *qseq, int data); //尾插
void PushFront(seqlist *qseq, int data); //头插
void PushInsert(seqlist *qseq,int pos, int data); //在顺序表中任意地方插入
void PrintSeq(seqlist *qseq); //打印顺序表
void PopBack(seqlist *qseq); //尾删
void PopFront(seqlist *qseq); //头删
void Erase(seqlist *qseq,DataType pos); //在删除指定位置上的数据
void ModifySeq(seqlist *qseq,DataType pos,DataType data);
int SearchSeq(seqlist *qseq,DataType data); //返回 所查询数据的下标
void RemoveSeq(seqlist *qseq,DataType data); //查询并删除数据
void BubbleSeq(seqlist *qseq); //冒泡排序
int BinarySeq(seqlist *qseq,DataType data); //二分查找,找到返回下标
void DestorySeq(seqlist *qseq,DataType data); //销毁顺序表
#endif //_SEQLIST_H__
seqlist.c部分:
#include "seqlist.h"
#include <stdio.h>
void SeqInit(seqlist *qseq) //初始化结构体,全部置为空
{
assert(qseq != NULL);
qseq->size = 0;
}
void PrintSeq(seqlist *qseq) //打印顺序表
{
int i = 0;
for(i = 0; i< qseq->size; i++)
{
printf("%d ",qseq->arr[i]);
}
printf("\n");
}
//插
void PushBack(seqlist *qseq, int data) //尾插
{
assert(qseq != NULL);
//assert(qseq->size== MAX_NUM);
if(qseq->size== MAX_NUM)
{
printf("顺序表已满,无法插入\n");
return ;
}
else
{
qseq->arr[qseq->size] = data;
qseq->size++;
}
}
void PushFront(seqlist *qseq, int data) //头插
{
int i= 0;;
//int i = 0;
//for(i=0; i<qseq->size; i++)
//{
// qseq->arr[qseq->size-i] = qseq->arr[qseq->size-1-i];
//}
assert(qseq!=NULL);
if(qseq->size==MAX_NUM)
{
printf("顺序表已满,无法插入\n");
return ;
}
else
{
for(i=qseq->size-1; i>=0; i--)
{
qseq->arr[i+1] = qseq->arr[i];
}
}
qseq->arr[0] = data;
qseq->size++;
}
void PushInsert(seqlist *qseq,int pos, int data) //在顺序表中任意地方插入
{
int i = 0;
for(i= qseq->size-1; i>= pos; i--)
{
qseq->arr[i+1] = qseq->arr[i];
}
qseq->arr[pos] = data;
qseq->size++;
}
//删
void PopBack(seqlist *qseq) //尾删
{
assert(qseq!=NULL); //传址地址不为空
assert(qseq->size>0); //顺序表不为空
qseq->size--;
}
void PopFront(seqlist *qseq) //头删
{
int i = 0;
assert(qseq!=NULL); //传址地址不为空
assert(qseq->size>0); //顺序表不为空
for(i=1; i<=qseq->size-1; i++)
{
qseq->arr[i-1] = qseq->arr[i];
}
qseq->size--;
}
void Erase(seqlist *qseq,int pos) //在删除指定位置上的数据
{
int i = pos; //pos代表的是第几个元素,最小是第一个元素,最大是第size个元素
assert(qseq != NULL);
assert(qseq->size>0);
assert(pos>=0 && pos<= qseq->size);
for(i; i+1<= qseq->size-1; i++)
{
qseq->arr[i] = qseq->arr[i+1];
}
qseq->size--;
}
//改
void ModifySeq(seqlist *qseq,int pos,int data) //
{
qseq->arr[pos] = data;
}
//查
int SearchSeq(seqlist *qseq,int data) //返回 所查询数据的下标
{
int i = 0;
for(i=0; i<qseq->size-1; i++)
{
if(data == qseq->arr[i])
{
return i;
}
}
return -1;
}
//销毁顺序表
void DestorySeq(seqlist *qseq) //销毁顺序表
{
qseq->size = 0;
}
//查找并删除 顺序表中的某个数据
void RemoveSeq(seqlist *qseq,DataType data)
{
int pos = SearchSeq(qseq,data);
if(pos == -1)
{
return -1;
}
Erase(qseq,pos);
}
void BubbleSeq(seqlist *qseq) //冒泡排序
{
int i=0;
int j = 0;
int tmp = 0;
int flag;
assert(qseq != NULL);
assert(qseq->size>0);
for(i=0; i<qseq->size-1; i++)
{
flag = 0;
for(j=0; j<qseq->size-1-i; j++)
{
if(qseq->arr[j]>qseq->arr[j+1])
{
flag=1;
tmp = qseq->arr[j];
qseq->arr[j] = qseq->arr[j+1];
qseq->arr[j+1] = tmp;
}
}
if(flag==0) //说明 顺序表 原本就有序(相邻的两个数之间没有进行交换)
{
break;
}
}
}
int BinarySeq(seqlist *qseq,DataType data) //二分查找,找到返回下标
{
int left = 0;
int right =qseq->size-1;
int mid = left+(right-left)/2;
while(left<=right)
{
if(data>qseq->arr[mid])
{
left = mid+1;
mid = left+(right-left)/2;
}
else if(data<qseq->arr[mid])
{
right = mid - 1;
mid = left+(right-left)/2;
}
else
{
return mid;
}
}
return -1;
}
test.c部分:
#include "seqlist.h"
int main()
{
int ret = 0;
seqlist seq;
SeqInit(&seq);
//PushBack(&seq,5);
//PushBack(&seq,3);
//PushBack(&seq,8);
//PushBack(&seq,1);
//PushBack(&seq,2); //53812
//PrintSeq(&seq); //打印顺序表
//PushFront(&seq,5);
//PushFront(&seq,4);
//PushFront(&seq,3);
//PushFront(&seq,2);
//PushFront(&seq,1); //12345
// PrintSeq(&seq);
//PushFront(&seq,5);
//PushFront(&seq,4);
//PushFront(&seq,3);
//PushFront(&seq,2);
//PushFront(&seq,1);
//PushInsert(&seq,3,8); //在下标为3的地方插入8 123845
//PrintSeq(&seq);
// PushInsert(&seq,2,9); //在下标为2的地方插入9 1293845
//PrintSeq(&seq);
// PopBack(&seq);
//PrintSeq(&seq); //129384
//PopFront(&seq);
//PrintSeq(&seq); //29384
//Erase(&seq,1);
// PrintSeq(&seq); //删除下标为1的数据 2384
//ModifySeq(&seq,3,9);
//PrintSeq(&seq); //2389
//SearchSeq(&seq,8); //输出数据8 对应的下标 即2
//ret = SearchSeq(&seq,8);
// RemoveSeq(&seq,8);
// PrintSeq(&seq);
//if(ret == -1)
//{
// printf("没找到");
//}
//else
// printf("%d",ret);
PushFront(&seq,5);
PushFront(&seq,8);
PushFront(&seq,3);
PushFront(&seq,2);
PushFront(&seq,4);
PushFront(&seq,1);
PushFront(&seq,7);
PushFront(&seq,10);
PushFront(&seq,9);
PushFront(&seq,6);
BubbleSeq(&seq); //1 2 3 4 5 6 7 8 9 10
PrintSeq(&seq);
BinarySeq(&seq,7);
ret = BinarySeq(&seq,7);
if(ret==-1)
{
printf("找不到\n");
}
else
{
printf("找到了,下标为%d\n",ret);
}
//DestorySeq(&seq);
//PrintSeq(&seq);
return 0;
}