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