导读
1.单链表(创建,插入,删除,查找(2),判空)
2.数组线性表(创建,插入,删除,查找,判空,判满)
3.循环链表(创建,插入,删除,判空)
4.运用数组线性表的串的替换暴力算法
单链表
#include <iostream>
using namespace std;
typedef struct LNode *List;
struct LNode{
int data;//以int为例
List next;
};
//创建空链表
List create(){
List head=new LNode;
head->next=NULL;
return head;
}
//判空
bool Isempty(List head){
if(head->next==NULL)
return true;
else return false;
}
//返回链表长度
int Length(List head){
int result=0;
List p=head->next;
while(p!=NULL){
result++;
p=p->next;
}
return result;
}
//查找第k个元素并返回其指针
List Findkth(List head,int k){
if(Isempty(head)){
cout<<"It's empty!"<<endl;
return NULL;
}
List p=head;
int i=0;
while(p!=NULL&&i<k){
p=p->next;
i++;
}
if(p==NULL)
{
cout<<"There is not such a data!"<<endl;
return NULL;
}
else return p;
}
//查找数值为i的元素并返回其指针
List Findelem(List head,int i){
if(Isempty(head)){
cout<<"It's empty!"<<endl;
return NULL;
}
List p=head->next;
while(p!=NULL&&p->data!=i)
p=p->next;
if(p==NULL)
//注意这里if与else的位置很重要,如果不先判定p为空很有可能报错
{
cout<<"There is not such a data!"<<endl;
return NULL;
}
else return p;
}
//插入元素,元素按照非递减排序
void Insert(List &head,int data){
List p=head;
List s=new LNode;
s->data=data;
while(p->next!=NULL&&p->next->data<data)
p=p->next;
s->next=p->next;
p->next=s;
}
//删除一个元素,这里用return 的效率不如用引用的效率高
void Deletedata(List &head,int data){
List p=head;
List s;
if(Isempty(head))
cout<<"It's empty!"<<endl;
while(p->next!=NULL&&p->next->data!=data)
p=p->next;
if(p->next->data==data){
s=p->next;
p->next=p->next->next;
delete(s);
}
else
cout<<"There is not such a data!"<<endl;
}
int main(){
List chain;
List p;
chain=create();
for(int i=1;i<=10;i++)
{
Insert(chain,i);
}
cout<<"链表长度:"<<endl;
cout<<Length(chain)<<endl;
cout<<"查找第5个元素:"<<endl;
p=Findkth(chain,5);
cout<<p->data<<endl;
cout<<"查找元素7:"<<endl;
p=Findelem(chain,7);
cout<<p->data<<endl;
cout<<"删除元素8"<<endl;
Deletedata(chain,8);
cout<<"查找元素8"<<endl;
p=Findelem(chain,8);
return 0;
}
输出结果
链表长度:
10
查找第5个元素:
5
查找元素7:
7
删除元素8
查找元素8
There is not such a data!
Program ended with exit code: 0
数组线性表
#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef struct Node *snode;
struct Node{
char data[MAXSIZE+1];
int length;
};
//数组初始化
snode init(){
snode head=new Node;
head->length=0;
return head;
}
//判空
bool Isempty(snode head){
bool flag=false;
if(head->length==0)
flag=true;
return flag;
}
//判满
bool Isfull(snode head){
bool flag=false;
if(head->length==MAXSIZE)
flag=true;
return flag;
}
//插入数据
void insert(snode &head,char data){
int i;
for(i=1;i<=head->length&&head->data[i]<data;)
{i++;}
if(i>head->length)
head->data[i]=data;
else{
i--;
for(int j=head->length;j>=i;j--){
head->data[j+1]=head->data[j];
}
head->data[i]=data;
}
head->length++;
}
//删除数据
void del(snode &head,char data){
for(int i=1;i<=head->length;i++){
if(head->data[i]==data){
for(int j=i;j<=head->length;j++)
head->data[j]=head->data[j+1];
head->length--;
}
}
}
//查找数据
void find(snode &head,char data){
bool flag=false;
for(int i=1;i<=head->length;i++){
if(head->data[i]==data){
cout<<"yes,it's here.The position is "<<i<<endl;
flag=true;
}
}
if(flag==false)
cout<<"There is not such a data"<<endl;
}
int main(){
snode list;
list=init();
for(char i='a';i<='m';i++){
insert(list,i);
}
find(list,'k');
del(list,'k');
find(list,'k');
return 0;
}
输出结果
yes,it’s here.The position is 11
There is not such a data
Program ended with exit code: 0
循环链表
以约瑟夫环为例:
输入:人数n,(编号为1~n),约瑟夫环数m(每m人淘汰一次)
输出:按照出圈顺序打印编号
#include <iostream>
using namespace std;
typedef struct Node *List;
struct Node{
int num;
List next;
};
//创建循环链表
List init(int num){
List flag=new Node;
flag->num=num;
flag->next=flag;
return flag;
}
//判空
bool Isempty(List flag){
if(flag)
return false;
else return true;
}
//插入元素
void insert(int num,List &flag){
List s=new Node;
s->num=num;
s->next=flag->next;
flag->next=s;
flag=s;
}
//删除第k个元素
void del(List &flag,int k){
if(Isempty(flag))
cout<<"it's empty!"<<endl;
List p=flag;
//循环链表删除要分k=1和k>1两种情况
if(k==1){
List p1=flag;
while(p->next!=flag)
p=p->next;
p->next=flag->next;
flag=flag->next;
cout<<p1->num<<endl;
delete(p1);
}
else{
List p2;
for(int i=1;i<=k-2;i++)
p=p->next;
p2=p->next;
p->next=p->next->next;
flag=p->next;
cout<<p2->num<<endl;
delete(p2);
}
}
//如果每次删除的k都不同,则需要将k定义为引用类型
int main(){
List flag;
int n,m;
cout<<"输入人数n和淘汰数m:"<<endl;
cin>>n>>m;
flag=init(1);
for(int i=2;i<=n;i++){
insert(i,flag);
}
flag=flag->next;//此步用于回到第1个人的位置
for(int i=1;i<=n;i++)
del(flag,m);
return 0;
}
输出结果
输入人数n和淘汰数m:
3 3
3
1
2
Program ended with exit code: 0
运用数组线性表的串的替换暴力算法
#include <iostream>
using namespace std;
#define MAXSIZE 100
struct chuan{
char data[MAXSIZE+1];
int length;
};
bool compare(char a,char b){
if(a==b) return true;
else return false;
}
//暴力匹配算法
int match(chuan S,chuan T,int start){
int flag,i,j;
for(flag=start;flag<=S.length-T.length+1;flag++)
{
for(j=1,i=flag;j<=T.length;i++,j++){
if(compare(S.data[i],T.data[j])==false)
break;
}
if(j>T.length)
break;
}
if(flag>S.length-T.length+1)
return 0;//匹配失败返回0
return flag;//匹配成功返回位置
}
//替换算法
void replace(chuan &S,chuan T,chuan V,int flag){
//1.替换串与被替换串长度一样
if(T.length==V.length){
for(int i=flag,j=1;i<=T.length;i++,j++)
S.data[i]=V.data[j];
}
//2.替换串长度小于被替换串
else if(T.length>V.length){
int k=T.length-V.length;
//要缩短的长度
for( int i=flag+V.length;i<=S.length-T.length+V.length;i++){
S.data[i]=S.data[i+k];
}
for(int i=flag,j=1;j<=V.length;i++,j++)
S.data[i]=V.data[j];
S.length-=k;
}
//3.替换串长度大于被替换串
else{
int k=V.length-T.length;
//要增加的长度
for(int i=S.length;i>=flag+T.length;i--){
S.data[i+k]=S.data[i];
}
for(int i=flag,j=1;j<=V.length;i++,j++){
S.data[i]=V.data[j];
}
S.length+=k;
}
}
//打印函数
void output(chuan S){
for(int i=1;i<=S.length;i++)
cout<<S.data[i];
cout<<endl;
}
int main(){
chuan S,T,V;
char a;
int len=0;
cout<<"请输入主串:"<<endl;
while((a=getchar())!='\n')
{
len++;
S.data[len]=a;
}
S.length=len;
len=0;
cout<<"请输入被替换串:"<<endl;
while((a=getchar())!='\n')
{
len++;
T.data[len]=a;
}
T.length=len;
len=0;
cout<<"请输入替换串:"<<endl;
while((a=getchar())!='\n')
{
len++;
V.data[len]=a;
}
V.length=len;
output(S);
int i=1;
//一个主串里可能有多个被替换串
while(i<=S.length-T.length+1){
i=match(S,T,i);
if(i!=0)
{
replace(S,T,V,i);
i+=V.length;
}
else break;
}
output(S);
return 0;
}
输出结果
请输入主串:
retioioret
请输入被替换串:
ret
请输入替换串:
df
retioioret
dfioiodf
Program ended with exit code: 0