7-1 线性表A,B顺序存储合并与双向循环链表应用

有两张非递增有序的线性表A,B,采用顺序存储结构,两张表合并用c表存,要求C为非递减有序的,然后删除C表中值相同的多余元素。元素类型为整型

输入格式:

第一行输入输入表A的各个元素,以-1结束,中间用空格分隔;第二行输入表B的各个元素,以-1结束,中间用空格分隔。

输出格式:

输出结果为表C的非递减有序序列,中间用英文逗号分隔

输入样例:

在这里给出一组输入。例如:

9 8 7 -1
10 9 8 4 3 -1
 
结尾无空行

输出样例:

在这里给出相应的输出。例如:

3,4,7,8,9,10
 
结尾无空行
 
 
#include<iostream>
#include<cstring>
using namespace std;
typedef struct fff{
    int data;
    fff* next;
}node,*Node;
void build(fff *p){
    int x;
    while(cin>>x,~x){
        fff *now=new node();
        now->data=x;
        now->next=p->next;
        p->next=now;
    }
}
void build(Node p1,Node p2,Node pre){
    p1=p1->next;
    p2=p2->next;
    while(p1!=NULL&&p2!=NULL){
        if(p1->data<=p2->data){
            Node now=new node();
            now->data=p1->data;
            now->next=pre->next;
            pre->next=now;
            pre=pre->next;
            p1=p1->next;
        }
        else{
            Node now=new node();
            now->data=p2->data;
            now->next=pre->next;
            pre->next=now;  
            pre=pre->next;
            p2=p2->next;
        }
    }
    while(p1!=NULL){
        Node now=new node();
        now->data=p1->data;
        now->next=pre->next;
        pre->next=now;
        pre=pre->next;
        p1=p1->next;
    }
    while(p2!=NULL){
        Node now=new node();
        now->data=p2->data;
        now->next=pre->next;
        pre->next=now;
        pre=pre->next;
        p2=p2->next;
    }
}
void flush(Node p){
    if(p)p=p->next;
    Node pre=p;
    if(p)p=p->next;
    while(p!=NULL){
        if(p->data==pre->data){
            pre->next=p->next;
            Node k=p;
            p=p->next;
            delete k;
        }
        else{
            pre=p;
            p=p->next;
        }
    }
}
void show(Node p){
    p=p->next;
    while(p!=NULL){
        cout<<p->data;
        p=p->next;
        if(p!=NULL) cout<<',';
    }
}
int main(){
    Node p1=new node();
   
    build(p1);
    
    Node p2=new node();
    p2->next=NULL;
    build(p2);
    
    Node p3=new node();
    p3->next=NULL;
    build(p1,p2,p3);
    flush(p3);
    
    show(p3);
    
    return 0;
}

 

 

 

7-2 双向循环链表应用 

已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,实现交换p所指向的结点和它的前缀结点的顺序。

输入格式:

第一行输入元素个数,第二行输入元素值,第三行输入要交换的元素值,第四行输出结果。

输出格式:

输出交换后的结果,中间不用空格分隔,若要交换的值:4,不在数组终,则输出“未找到4”

输入样例:

在这里给出一组输入。例如:

6
1 2 3 4 5 6
6
 
结尾无空行

输出样例:

在这里给出相应的输出。例如:

123465
 
结尾无空行
 
#include<iostream>
#include<cstring>
using namespace std;
typedef struct fff{
    int data;
    fff* next;
    fff* pre;
}node,*Node;
void build(Node p){
    int n;
    cin>>n;
    while(n--){
        int x;
        cin>>x;
        Node now=new node();
        now->data=x;
        now->pre=p;
        now->next=NULL;
        p->next=now;
        p=p->next;
    }
}
void show(Node p){
    p=p->next;
    while(p!=NULL){
        cout<<p->data;
        p=p->next;
    }
}
void change(Node p){
    Node o=p;
    p=p->next;
    p=p->next;
    int x;
    cin>>x;
    while(p!=NULL&&p->data!=x){
        p=p->next;
    }
    if(p==NULL){
        cout<<"未找到"<<x;
    }
    else{
        Node pp=p->pre,ppp=pp->pre;
        Node a=pp->pre,b=pp,c=p,d=p->next;
        ppp->next=p;
        pp->pre=c;
        pp->next=d;
        p->pre=a;
        p->next=b;
        show(o);
    }
}

int main(){
    Node p=new node();
    p->next=NULL;
    build(p);
    
    change(p);
    
    return 0;
}

 

一开始觉得链表是很难的,因为涉及到了指针等等,不过经过一段时间对于链表的相关知识的练习和本次实验,我对于链表相对来说有了一些领悟,看起来也不是像一开始一样晦涩难懂,对于链表这种东西,确实如老师所说的一般,需要多练,自己去思考和实践,动手去写才能真的学习更好一点。

posted @ 2021-11-22 22:52  zrswheart  阅读(268)  评论(0编辑  收藏  举报