线性表A,B顺序存储合并
实验项目名称:实验一
一、 实验目的
掌握顺序表的基本操作。
掌握单链表的基本操作。
掌握循环链表的基本操作。
二、 实验内容
实验题目
6-3 链表逆置
7-1 线性表A,B顺序存储合并
7-2 双向循环链表应用
三、 设计文档
模块图手绘拍照插入即可
四、 源程序
6-3 链表逆置:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *reverse( struct ListNode *head );
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *head;
head = createlist();
head = reverse(head);
printlist(head);
return 0;
}
/* 你的代码将被嵌在这里 */
struct ListNode *reverse( struct ListNode *head )
{
struct ListNode *L=(struct ListNode*)malloc(sizeof(struct ListNode)),*p,*q;//L就是新的头节点
L->next=NULL;
p=head;//遍历的是p,相当于中间变量
while(p)
{
q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->data=p->data;
q->next=L->next;//头插法
L->next=q;//头插法 q,新节点
p=p->next;
}
return L->next;
}
7-1 线性表A,B顺序存储合并
#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 双向循环链表应用
#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;
}
五、 个人体会(此部分与拼题a上一致)
实验中遇到难以解决头指针问题,上网浏览了csdn给出了一些结果。
在这次的实验课程中,我深刻体会到了链表定义等等方式。
struct ListNode *reverse( struct ListNode *head );
其中head是用户传入的链表的头指针;函数reverse将链表head逆置,并返回结果链表的头指针。
双向链表的每个结点需要连接前一个结点和后一个结点,所以需要定义两个指针域,分别指向前一个结点和后一个结点。