顺序表是计算机内存中以数组形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式就称之为顺序表。
要实现顺序表呢,首先就要定义结构体变量
#define seqlistmaxsize 1000
typedef char seqtype;
typedef struct seqlist{
seqtype c[seqlistmaxsiz];
size_t size;
}seqlist;
接下来我们就要添加上所需要的头文件等,做好我们的准备工作
#pragma once
#define HEADER printf("\n-----------%s----------\n",__FUNCTION__)
#include<stdio.h>
#include<stdlib.h>
seqlist seq;//声明一个顺序表
void seqlist_print(srqlist *seq);//打印函数的声明
void seqlist_init(seqlist *seq);//初始化顺序表
void seqlist_pushback(seqlist *seq,seqtype value);//尾插
void seqlist_popback(seqlist *seq);//尾删
void seqlist_pushhead(seqlist *seq,seqtype value);//头插
void seqlist_pophead(seqlist *seq);//头删
void seqlist_insert(seqlist *seq,size_t pos,seqtype value);//给给定位置插元素
void seqlist_pop(seqlist *seq,size_t pos);//删除指定位置的元素
void seqlist_find(seqlist *seq,seqtype value);//查找某一元素的位置
void seqlist_read(seqlist *seq,size_t pos);//读取给定位置元素是什么
void seqlist_instead(seqlist *seq,size_t pos,seqtype value);用value替换pos位置的元素
做好准备工作后,我门就可以来实现我们的各个功能
首先我们要实现的就是我们的初始化和打印功能
void seqlist_init(seqlist *seq)
{
if(seq==NULL)
{
return;
}
seq->size=0;
}
void seqlist_print(seqlist *seq)
{
if(seq->size==0)
{
return;//空顺序表
}
size_t i=0;
for(i=0;i<seq->size;i++)
{
printf("[%c] ",seq->c[i]);
}
printf("\n");
}
下面实现尾插,尾删操作
void seqlist_pushback(seqlist *seq,seqtype value)
{
if(seq==NULL)
{
return;//顺序表不存在
}
if(seq->size>=seqlistmaxsize)
{
return;//满了
}
else
{
seq->c[seq->size]=value;
++(seq->size);
}
}
void seqlist_popback(seqlist *seq)
{
if(seq==NULL)
{
return;//非法输入
}
if(seq->size==0)
{
return;//空顺序表删不了
}
else
{
seq->size--;
}
}
下面我们要实现的是顺序表的头插,头删
void seqlist_pushhead(seqlist *seq,seqtype value)
{
if(seq==NULL)
{
return;//非法输入
}
if(seq->size>=seqlistmaxsize)
{
return;//满了
}
else
{
size_t i=seq->size-1;
for(;i>=0;i--)
{
seq->c[i+1]=seq->c[i];
}
seq->c[0]=value;
seq->size++;
}
}
void seqlist_pophead(seqlist *seq)
{
if(seq==NULL)
{
return;//非法输入
}
if(seq->size==0);
{
return;//空顺序表,删不了
}
else
{
size_t i=0;
for(;i<seq->size-1;i++)
{
seq->c[i]=seq->c[i+1];
}
seq->size--;
}
}
下面我们就要提高难度了
接下来进行的就是任意位置插入,任意位置删除
void seqlist_insert(seqlist *seq,seqlist *pos,seqtype value)
{
if(seq==NULL)
{
return;//非法输入
}
if(seq->size>=seqlistmaxsize)
{
return;//满了
}
else
{
seq->size++;//先size++和转换元素后size++都是可以的,因为这段内存空间你已经申请了,用多少是自己说了算,后面size++了之后我们才可以看到加进去的元素
size_t i=seq->size-1;
for(i=seq->size-1;i>=pos;i--)
{
seq->c[i+1]=seq->c[i];
}
seq->c[pos]=value;
}
}
void seqlist_pop(seqlist *seq,seqlist *pos)
{
if(seq==NULL)
{
return;//非法输入
}
if(seq->size==0)
{
return;//空
}
else
{
size_t i=seq->size-1;
for(;i>=pos;i--)
{
seq->c[i]=seq->c[i+1];
}
seq->size--;
}
}
下面我们来实现读取某一个位置的元素,查找某一元素的位置
void seqlist_read(seqlist *seq,size_t pos)
{
if(seq==NULL)
{
return;//
}
if(seq->size==0)
{
return;//空
}
printf("[%c] \n",seq->c[pos]);
}
int seqlist_find(seqlist *seq,seqtype value)
{
if(seq==NULL)
{
return;
}
if(seq->size==0)
{
return;
}
size_t i=0;
for(;i<seq->size;i++)
{
if(seq->c[i]==value)
{
return i;
}
}
return -1;
}
现在我们需要实现的是删除指定元素和所有指定的元素
void seqlist_remove(seqlist *seq,seqtype value)
{
if(seq==NULL)
{
return;
}
if(seq->size==0)
{
return;
}
seqlist *pos=seqlist_find(seq,value);
seqlist_pop(seq,pos);
}
void seqlist_removeall(seqlist *seq,seqtype value)
{
if(seq==NULL)
{
return;
}
if(seq->size==0)
{
return;
}
while(1)
{
seqlist *pos=seqlist_find(seq,value);
seqlist_pop(seq,pos);
}
}
接着我们要实现替换元素的操作
void seqlist_instead(seqlist *seq,seqlist *pos,seqtype value)
{
if(seq==NULL)
{
return;
}
if(seq->size==0)
{
return;
}
else
{
seq->c[pos]=value;
}
}
下面我们终于来到的本次顺序表实现最难的地方
实现冒泡排序和选择排序
void seqlist_bubblesort(seqlist *seq)
{
if(seq==NULL)
{
return;
}
if(seq->size==0)
{
return;
}
else
{
size_t i=0;
size_t j=0;
for(i=0;i<seq->size-1;i++)
{
for(j=0;j<seq->size-1-i;j++)
{
if(seq->c[j]>seq->c[j+1])
{
swap(&seq->c[j],&seq->c[j+1]);
}
}
}
}
}
void seqlist_xuanze(seqlist *seq)
{
if(seq==NULL)
{
return;
}
if(seq->size==0)
{
return;
}
else
{
size_t i=0;
size_t j=0;
for(i=0;i<seq->size-1;i++)
{
for(j=i+1;j<seq->size,j++)
{
if(seq->c[i]>seq->c[j])
{
swap(&seq->c[i],&seq->c[j]);
}
}
}
}
}
很nice,这里基本上就是顺序表的功能实现;
互相学习;如果有错误请指出谢谢