数据结构笔记1---链表与顺序表

导读

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值