线性表A,B顺序存储合并

实验项目名称:实验一          

一、     实验目的

掌握顺序表的基本操作。

掌握单链表的基本操作。

掌握循环链表的基本操作。

 

二、  实验内容

实验题目

6-3 链表逆置

7-1 线性表AB顺序存储合并

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 线性表AB顺序存储合并

#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逆置,并返回结果链表的头指针。

双向链表的每个结点需要连接前一个结点和后一个结点,所以需要定义两个指针域,分别指向前一个结点和后一个结点。

posted @ 2022-10-11 18:56  YE-  阅读(38)  评论(0编辑  收藏  举报