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

来源:互联网 发布:mac cocos 环境搭建 编辑:程序博客网 时间:2024/05/15 17:12

导读

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 100typedef 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 100struct 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