需求如下:
1. 初始化
2. 尾插
3. 尾删
4. 头插
5. 头删
6. 读任意位置元素
7. 修改任意位置元素
8. 查找指定元素值的下标
9. 在任意位置插入元素
这次我们的编程环境是Linux下,所以我们要创建一个seqlist.h与seqlist.c的文件,以及Makefile将其联合在一起。
废话不多说,我们开始编写代码。
seqlist.h
#pragma noce
#include <stdio.h>
#define SeqlistMaxSize 100 //定义一个数组大小的宏
#define DELIMITER printf("------------------------分割线-----------------------\n");
typedef char SeqListType;
typedef struct SeqList{
SeqListType arr[SeqlistMaxSize];
size_t size;
}seqlist;
void SeqListInit(seqlist *seq);
void SeqListPushEnd(seqlist *seq,char value);
void SeqListPopEnd(seqlist *seq);
void SeqListPushFirst(seqlist *seq,char value);
void SeqListPopFirst(seqlist *seq);
void SeqListGetNum(seqlist *seq,size_t pos,char *argv);
void SeqListReviseNum(seqlist *seq,size_t pos,char value);
void SeqListFindPos(seqlist *seq,char value,int *argv);
void SeqListInsert(seqlist *seq,size_t pos,char value);
void SeqListRemove(seqlist *seq,char value);
void SeqListRemoveAll(seqlist *seq,char value);
void SeqListRemovePos(seqlist **seq,size_t pos);
size_t SeqLsitSize(seqlist *seq);
int SeqListEmpty(seqlist *seq);
void SeqLsitBubbleSort(seqlist *seq);
seqlist.c
#include "seqlist.h"
//初始化
void SeqListInit(seqlist *seq)
{
if(seq == NULL)
{
return;
}
seq->size = 0;
return;
}
//尾插
void SeqListPushEnd(seqlist *seq,char value)
{
if(seq == NULL)
{
return;
}
if(seq->size > SeqlistMaxSize)
{
printf("Seqlist is full.\n");
return;
}
seq->arr[seq->size] = value;
++seq->size;
return;
}
//尾删
void SeqListPopEnd(seqlist *seq)
{
if(seq == NULL)
{
return;
}
if(seq->size == 0)
{
printf("SeqList is null.\n");
return;
}
--seq->size;
return;
}
//头插
void SeqListPushFirst(seqlist *seq,char value)
{
if(seq == NULL)
{
return;
}
if(seq->size >= SeqlistMaxSize)
{
printf("Seqlist is full.\n");
return;
}
++seq->size;
int i = 1;
for(; i<=seq->size; i++)
{
seq->arr[seq->size-i]=seq->arr[seq->size-i-1];
}
seq->arr[0] = value;
return;
}
//头删
void SeqListPopFirst(seqlist *seq)
{
if(seq == NULL)
{
return;
}
if(seq->size == 0)
{
printf("SeqList is null.\n");
return;
}
--seq->size;
int i = 0;
for(; i<seq->size; i++)
{
seq->arr[i] = seq->arr[i+1];
}
return;
}
//读取任意位置元素,打印元素
void SeqListGetNum(seqlist *seq,size_t pos,char *argv)
{
if(seq == NULL)
{
return;
}
if(seq->size == 0)
{
printf("SeqList is null.\n");
return;
}
if(pos <= seq->size-1)
{
*argv = seq->arr[pos];
return;
}
else
{
printf("Input 'pos' error.\n");
}
return;
}
//修改任意元素
void SeqListReviseNum(seqlist *seq,size_t pos,char value)
{
if(seq == NULL)
{
return;
}
if(seq->size == 0)
{
printf("SeqList is null.\n");
return;
}
if(pos <= seq->size-1)
{
seq->arr[pos] = value;
}
else
{
printf("Input 'pos' error.\n");
}
return;
}
//打印指定元素下标
void SeqListFindPos(seqlist *seq,const char value,int *pos)
{
if(seq == NULL)
{
return;
}
if(seq->size == 0)
{
printf("SeqList is null.\n");
return;
}
int i = 0;
for(;i<seq->size;i++)
{
if(seq->arr[i] == value)
{
*pos = i;
return;
}
}
printf("SeqList is not find.\n");
return;
}
//在任意位置插入元素
void SeqListInsert(seqlist *seq,size_t pos,char value)
{
if(seq == NULL)
{
return;
}
if(seq->size == 0)
{
printf("SeqList is null.\n");
return;
}
if(pos >= seq->size-1)
{
printf("pos error.\n");
return;
}
++seq->size;
int i = seq->size-1;
for(;i>=pos;--i)
{
seq->arr[i] = seq->arr[i-1];
}
seq->arr[pos] = value;
return;
}
//删除指定的值,如果有只删除一个
void SeqListRemove(seqlist *seq,char value)
{
if(seq == NULL)
{
return;
}
if(seq->size == 0)
{
printf("SeqList is null.\n");
return;
}
int i = 0;
for(;i<seq->size-1;i++)
{
if(seq->arr[i] == value)
{
while(i<seq->size-1)
{
seq->arr[i] = seq->arr[i+1];
++i;
}
--seq->size;
return;
}
if(i == seq->size-1)
{
printf("no find 'value.\n'");
return;
}
}
return;
}
//删除指定下标的值(与SeqListRemoveAll函数相匹配)
void SeqListRemovePos(seqlist **seq,size_t pos)
{
if((*seq) == NULL)
{
return;
}
if((*seq)->size == 0)
{
printf("SeqList is null.\n");
return;
}
if(pos>(*seq)->size-1)
{
printf("pos is error.\n");
return;
}
size_t i = pos;
for(;i<(*seq)->size;i++)
{
(*seq)->arr[i]=(*seq)->arr[i+1];
}
--(*seq)->size;
return;
}
//删除指定的值,如果存在多个,则全部删除
void SeqListRemoveAll(seqlist *seq,char value)
{
if(seq == NULL)
{
return;
}
if(seq->size == 0)
{
printf("SeqList is null.\n");
return;
}
size_t i = 0;
for(;i<seq->size;i++)
{
if(seq->arr[i] == value)
{
SeqListRemovePos(&seq,i);
--i;
}
if(i == seq->size)
{
printf("no find 'value.'\n");
return;
}
}
return;
}
//返回链表的长度
size_t SeqListSize(seqlist *seq)
{
if(seq == NULL)
{
return -1;
}
if(seq->size == 0)
{
printf("SeqList is null.\n");
return 0 ;
}
return seq->size;
}
//判断链表是否为空,如果为空则返回1,如果不为空为0,不存在这个链表则为-1
int SeqListEmpty(seqlist *seq)
{
if(seq == NULL)
{
return -1;
}
if(seq->size == 0)
{
printf("SeqList is null.\n");
return 1 ;
}
return 0;
}
//将链表进行冒泡排序(默认为升序)
void SeqListBubbleSort(seqlist *seq)
{
if(seq == NULL)
{
return;
}
if(seq->size == 0)
{
printf("SeqList is null.\n");
return;
}
int i = 0;
int j = 0;
for(j=0;j<seq->size-1;j++)
{
for(i=0;i<seq->size-j;i++)
{
if(seq->arr[i] > seq->arr[i+1])
{
seq->arr[i]=(seq->arr[i])^(seq->arr[i+1]);
seq->arr[i+1]=(seq->arr[i])^(seq->arr[i+1]);
seq->arr[i]=(seq->arr[i])^(seq->arr[i+1]);
}
}
}
return;
}
//-------------------------------------------------------------------------
//测试函数
//-------------------------------------------------------------------------
#include <stdio.h>
char argv = 0;//这个是打印元素的载体
int pos = -1;//这个是打印下标的载体
//打印函数
void SeqListPrint(seqlist *seq,const char *msg)
{
if(seq == NULL)
{
return;
}
DELIMITER;
printf("%s\n",msg);
int i = 0;
for(; i<seq->size; i++)
{
printf("[%c]",seq->arr[i]);
}
printf("\n");
if(argv != 0)
{
printf("%c\n",argv);
argv = 0;
}
if(pos != -1)
{
printf("%d\n",pos);
pos = -1;
}
return;
}
//测试函数
void SeqListTest()
{
seqlist seq;
SeqListInit(&seq);
SeqListPushEnd(&seq,'a');
SeqListPushEnd(&seq,'b');
SeqListPushEnd(&seq,'c');
SeqListPushEnd(&seq,'d');
SeqListPrint(&seq,"SeqListPushEnd");
SeqListPopEnd(&seq);
SeqListPrint(&seq,"SeqListPopEnd");
SeqListPushFirst(&seq,'x');
SeqListPrint(&seq,"SeqListPushFirst");
SeqListPopFirst(&seq);
SeqListPrint(&seq,"SeqListPopFirst");
SeqListGetNum(&seq,2,&argv);
SeqListPrint(&seq,"SeqListGetNum");
SeqListReviseNum(&seq,1,'v');
SeqListPrint(&seq,"SeqListReviseNum");
SeqListFindPos(&seq,'v',&pos);
SeqListPrint(&seq,"SeqListFindPos");
SeqListInsert(&seq,1,'z');
SeqListPrint(&seq,"SeqListInsert");
SeqListRemove(&seq,'c');
SeqListPrint(&seq,"SeqListRemove");
SeqListRemoveAll(&seq,'c');
SeqListPrint(&seq,"SeqListRemoveAll");
SeqListPrint(&seq,"SeqListSize");
printf("%d\n",SeqListSize(&seq));
SeqListPrint(&seq,"SeqListEmpty");
printf("%d\n",SeqListEmpty(&seq));
SeqListBubbleSort(&seq);
SeqListPrint(&seq,"SeqListBubbleSort");
return;
}
//主函数
int main()
{
SeqListTest();
return 0;
}
Makefile
seqlist:seqlist.c
gcc $^ -o $@;
.PHONY:clean
clean:rm seqlist
最后附上我整体运行的图片