今天学习了顺序表,对里面的知识有所了解,想通过自己的努力实现一下自己的顺序表
首先我们要写一个头文件,包含我们所有要实现的功能
#pragma once
#define HEADER printf("\n------------%s-----------\n",__FUNCTION__)
#include<stdio.h>
#include<stdlib.h>
#define seqlistmaxsize 1000
typedef char seqtype;
typedef struct seqlist{
seqtype c[seqlistmaxsize];
size_t size;
}seqlist;
void printseqlist(seqlist *seq);//打印顺序表
void seqlistInit(seqlist *seq);//初始化顺序表
void seqlistpushback(seqlist *seq,char value);//尾插元素
void seqlistpopback(seqlist *seq);//尾删元素
void seqlistpushhead(seqlist *seq,char value);//头插
void seqlistpophead(seqlist *seq);//头删
void seqlistinsert_pos(seqlist *seq,size_t pos,char value);//随机插
void seqlistpush_pos(seqlist *seq,size_t pos);//随机删
void seqlistfind(seqlist *seq,char value);//查找一个元素
void seqlistread(seqlist *seq,size_t pos);//读取一个元素
void seqlistinstead(seqlist *seq,size_t pos,char value);//替换一个元素
就下来我们就要一点点实现每一个函数
首先我们需要实现的就是 打印顺序表的函数,以及初始化顺序表的函数
#include "seqlist.h"
void printseqlist(seqlist *seq){
size_t i = 0;
if(seq->size==0){
printf("kong,over");
return;
}
for(i=0;i<seq->size;i++){
printf("[%c]",seq->c[i]);
}
printf("\n");
}
void seqlistInit(seqlist *seq){
if(NULL==seq){
return;
}
seq->size=0;
}
接下来是尾插,尾删
void seqlistpushback(seqlist *seq,char value){
if(seq->size >= 1000){
return;//manle
}
seq->c[seq->size]=value;
++(seq->size);
}
void seqlistpopback(seqlist *seq){
if(NULL==seq){
return;
}
if(seq->size==0){
return;//neirongkong,wufashan
}
seq->size--;
printf("weishanhoudeshunxubiao\n");
}
以及他们的测试代码
void testpushback(){
HEADER;
seqlist seq;
seqlistInit(&seq);
seqlistpushback(&seq,'a');
seqlistpushback(&seq,'b');
seqlistpushback(&seq,'c');
printf("weichahoudeshunxubiao\n");
printseqlist(&seq);
}
void testpopback(){
HEADER;
seqlist seq;
seqlistInit(&seq);
seqlistpushback(&seq,'a');
seqlistpushback(&seq,'b');
seqlistpushback(&seq,'c');
printseqlist(&seq);
seqlistpopback(&seq);
printseqlist(&seq);
}
下面我们从头部开始插入或者删除:
void seqlistpushhead(seqlist *seq,char value){
if(NULL==seq){
return;
}
if(seq->size==1000){
return;//manle,bunengcha
}
else{
int i=seq->size-1;
for(;i>=0;i--){
seq->c[i+1]=seq->c[i];
}
seq->c[0]=value;
seq->size++;
printf("touchahoudeshunxubiao\n");
}
}
void seqlistpophead(seqlist *seq){
if(NULL==seq){
return;
}
else if(seq->size==0){
return;//kong,shanbuliao
}
else{
size_t i=1;
for(;i<seq->size;i++){
seq->c[i-1]=seq->c[i];
}
seq->size--;
printf("toushanhoudeshunxubiao\n");
}
}
还有他们的测试函数:
void testpushhead(){
HEADER;
seqlist seq;
seqlistInit(&seq);
seqlistpushback(&seq,'a');
seqlistpushback(&seq,'b');
seqlistpushback(&seq,'c');
printseqlist(&seq);
seqlistpushhead(&seq,'x');
printseqlist(&seq);
}
void testpophead(){
HEADER;
seqlist seq;
seqlistInit(&seq);
seqlistpushback(&seq,'a');
seqlistpushback(&seq,'b');
seqlistpushback(&seq,'c');
printseqlist(&seq);
seqlistpophead(&seq);
printseqlist(&seq);
}
在我们实现了头插头删,尾插尾删之后。是不是觉得还少点什么,对了,我们要是想删除特定元素,或者删除特定位置的元素应该怎么办呢:
void seqlistpush_pos(seqlist *seq,size_t pos){
if(NULL==seq){
return;//bugenniwanle
}
else if(seq->size==0){
return;//kong,shanbuliao
}
else{
int m=seq->size;
for(;m>pos;m--){
seq->c[m]=seq->c[m+1];
}
seq->size--;
printf("shanchu---c[%d]---weizhideyuansu\n",pos); }
}
另外,要是咱们想要读取某个下标的元素,或者找到某个元素的下标,我们又该怎么办呢:
void seqlistread(seqlist *seq,size_t pos){
if(NULL==seq){
return;
}
else if(seq->size==0){
printf("kong,dubuliao\n");
return;
}
else
printf("duqu---c[%d]---deyuansu\n",pos);
printf("[%c]\n",seq->c[pos]);
}
void seqlistfind(seqlist *seq,char value){
if(NULL==seq){
return;
}
else if(seq->size==0){
printf("kong,zhaobuliao");
return;
}
else{
int i=0;
for(;i<seq->size;i++){
if(seq->c[i]==value){
printf("chazhao---[%c]---dejiaobiao\n",value);
printf("%d\n",i);
}
}
}
}
最后,如果我们想要将某一个位置的元素替换掉,应该怎么做呢:
void seqlistinstead(seqlist *seq,size_t pos,char value){
if(NULL==seq){
return;
}
else if(seq->size==0){
printf("kong,zhaobuliao");
return;
}
else{
seq->c[pos]=value;
printf("xiugaihoudeshunxubiao:\n");
}
}