山东理工大学 链表练习题答案

使用需明白,我提供的代码并不是给大家抄的,而是给大家一个思路来做题。如果你一开始就会意错了的话(只会抄的话),你的水平永远不会得到大的飞跃,如果你还对自己有严格的要求的话,就可以略微参考一下。代码有什么不好或不对的地方欢迎提出。有什么不懂的地方可以尽可能的提出来,我会做解答。可以当面叫我解答(提供给我小组的成员)。(天啊!说的好官方啊!快被自己唬住了!)


数据结构实验之链表一:顺序建立链表

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include <iostream>
using namespace std;

struct node
{
    int data;
    struct node *next;
};

int main()
{
    int i, n, m;
    struct node *head, *p, *q;
    scanf ( "%d", &n );
    head = NULL;
    for ( i = 1;i <= n; i++ )
    {
        scanf ( "%d", &m );
        p = (struct node *)malloc(sizeof(struct node));
        p->data = m;
        p->next = NULL;
        if(head == NULL)
            head = p;
        else
            q->next = p;
        q = p;
    }
    p = head;
    while(p != NULL)
    {
        printf ( p->next == NULL ? "%d\n" : "%d " , p->data );
        p = p->next;
    }
    return 0;
}

数据结构实验之链表二:逆序建立链表

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include <iostream>
using namespace std;

struct node
{
    int data;
    struct node *next;
};

int main()
{
    int i, n, m;
    struct node *head, *p;
    scanf ( "%d", &n );
    head = (struct node *)malloc(sizeof(struct node));
    head->next = NULL;
    for ( i = 1;i <= n; i++ )
    {
        scanf ( "%d", &m );
        p = (struct node *)malloc(sizeof(struct node));
        p->data = m;
        p->next = head->next;
        head->next = p;
    }
    p = head->next;
    while(p != NULL)
    {
        printf ( p->next == NULL ? "%d\n" : "%d " , p->data );
        p = p->next;
    }
    return 0;
}

数据结构实验之链表三:链表的逆置

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include <iostream>
using namespace std;

struct node
{
    int data;
    struct node *next;
};

int main()
{
    int m;
    struct node *head, *p;
    head = (struct node *)malloc(sizeof(struct node));
    head->next = NULL;
    while(~scanf ( "%d", &m ) && m != -1)
    {
        p = (struct node *)malloc(sizeof(struct node));
        p->data = m;
        p->next = head->next;
        head->next = p;
    }
    p = head->next;
    while(p != NULL)
    {
        printf ( p->next == NULL ? "%d\n" : "%d " , p->data );
        p = p->next;
    }
    return 0;
}

数据结构实验之链表四:有序链表的归并

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;

struct node
{
    int data;
    struct node *next;
};

struct node *create(int n)
{
    int i;
    struct node *head, *tail, *p;
    head = (struct node*)malloc(sizeof(struct node));
    head->next = NULL;
    tail = head;
    for ( i = 0;i <= n; i++ )
    {
        p = (node *)malloc(sizeof(node));
        if ( i != n )
        scanf ( "%d", &p->data );
        else
        p->data = (1 << 30 );
        p->next = NULL;
        tail->next = p;
        tail = p;
    }
//    p->next->data = (1 << 30);
//    tail = p->next;
//    tail->next = NULL;
    return head;
}

struct node *sumList(node *head1, node *head2, int num)
{
    node *p1, *p2, *p, *head, *tail;
    p1 = head1->next;
    p2 = head2->next;
    head = (struct node*)malloc(sizeof(struct node));
    head->next = NULL;
    tail = head;
    while ( num-- )
    {
        if (p1->data < p2->data)
        {
            p = (struct node*)malloc(sizeof(struct node));
            p->data = p1->data;
            p->next = NULL;
            tail->next = p;
            tail = p;
            p1 = p1->next;
        }
        else
        {
            p = (struct node*)malloc(sizeof(struct node));
            p->data = p2->data;
            p->next = NULL;
            tail->next = p;
            tail = p;
            p2 = p2->next;
        }
    }
    return head;
}

void display(struct node *sum)
{
    node *p;
    p = sum->next;
    while ( p != NULL )
    {
        printf ( p->next != NULL ? "%d " : "%d\n", p->data );
        p = p->next;
    }
}

int main()
{
    int n, m;
    struct node *head1, *head2, *sum;
    scanf ( "%d %d", &n, &m );
    head1 = create(n);
    head2 = create(m);
    sum = sumList(head1, head2, n+m);
    display(sum);
}

数据结构实验之链表五:单链表的拆分

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;

struct node
{
    int data;
    struct node *next;
};
int num1, num2;
struct node *head1, *head2;

struct node *create(int n)
{
    int i;
    struct node *head, *tail, *p;
    head = (struct node*)malloc(sizeof(struct node));
    head->next = NULL;
    tail = head;
    for ( i = 0;i < n; i++ )
    {
        p = (node *)malloc(sizeof(node));
        scanf ( "%d", &p->data );
        p->next = NULL;
        tail->next = p;
        tail = p;
    }
    return head;
}

void List(node *head, int n)
{
    node *tail1, *tail2, *p, *q;
    head1 = (struct node*)malloc(sizeof(struct node));
    head1->next = NULL;
    tail1 = head1;
    head2 = (struct node*)malloc(sizeof(struct node));
    head2->next = NULL;
    tail2 = head2;

    p = head->next;
    while ( n-- )
    {
        if (p->data%2 == 0 )
        {
            num1++;
            q = (struct node*)malloc(sizeof(struct node));
            q->data = p->data;
            q->next = NULL;
            tail1->next = q;
            tail1 = q;
            p = p->next;
        }
        else
        {
            num2++;
            q = (struct node*)malloc(sizeof(struct node));
            q->data = p->data;
            q->next = NULL;
            tail2->next = q;
            tail2 = q;
            p = p->next;
        }
    }
}

void display()
{
    node *p;
    p = head1->next;
    printf ( "%d %d\n", num1, num2 );
    while ( p != NULL )
    {
        printf ( p->next != NULL ? "%d " : "%d\n", p->data );
        p = p->next;
    }
    p = head2->next;
    while ( p != NULL )
    {
        printf ( p->next != NULL ? "%d " : "%d\n", p->data );
        p = p->next;
    }
}

int main()
{
    int n;
    num1 = num2 = 0;
    struct node *head;
    scanf ( "%d", &n );
    head = create(n);
    List(head, n);
    display();
}

数据结构实验之链表六:有序链表的建立

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;

struct node
{
    int data;
    struct node *next;
};

int main()
{
    int n, i, j;
    struct node *head, *tail, *p, *q;
    head = (struct node *)malloc(sizeof(struct node));
    head->next = NULL;
    tail = head;
    scanf ( "%d", &n );
    for ( i = 0;i < n; i++ )
    {
        p = (struct node *)malloc(sizeof(struct node));
        scanf ( "%d", &p->data );
        p->next = NULL;
        tail->next = p;
        tail = p;
    }
    for ( p = head->next;p != NULL;p = p->next )
    {
        for ( q = head->next;q != p;q = q->next )
        {
            if ( p->data < q->data )
            {
                j = p->data;
                p->data = q->data;
                q->data = j;
            }
        }
    }
    p = head->next;
    while( p )
    {
        printf ( p->next != NULL ? "%d " : "%d\n" , p->data );
        p = p->next;
    }
}

数据结构实验之链表七:单链表中重复元素的删除

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;

struct node
{
    int data;
    struct node *next;
};

int main()
{
    int n, i, j;
    struct node *head, *tail, *p, *q, *r;
    head = (struct node *)malloc(sizeof(struct node));
    head->next = NULL;
    tail = head;
    scanf ( "%d", &n );
    for ( i = 0;i < n; i++ )
    {
        p = (struct node *)malloc(sizeof(struct node));
        scanf ( "%d", &p->data );
        p->next = NULL;
        p->next = head->next;
        head->next = p;
    }
    printf ( "%d\n", n );
    p = head->next;
    while( p )
    {
        printf ( p->next != NULL ? "%d " : "%d\n" , p->data );
        p = p->next;
    }
    p = head->next;
    while ( p->next != NULL )
    {
        q = p;
        while ( q->next != NULL )
        {
            if (p->data == q->next->data)
            {
                r = q->next;
                q->next = r->next;
                free(r);
                n--;
            }
            else
                q = q->next;
        }
        p = p->next;
    }
    printf ( "%d\n", n );
    p = head->next;
    while( p )
    {
        printf ( p->next != NULL ? "%d " : "%d\n" , p->data );
        p = p->next;
    }
}

数据结构实验之链表八:Farey序列

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

struct node
{
    int erator;
    int minator;
    struct node *next;
};
node *head = new node;

void First_inti()
{
    node *tail;
    tail = head;
    for ( int i = 0;i < 2; i++ )
    {
        node *p = new node;
        p->erator = i;
        p->minator = 1;
        tail->next = p;
        tail = p;
    }
}

void create(int i)
{
    node *p, *q;
    p = head->next;
    while ( p->next )
    {
       q = p->next;
       if ( p->minator+q->minator <= i )
       {
           node *tail = new node;
           tail->minator = p->minator+q->minator;
           tail->erator = p->erator+q->erator;
           p->next = tail;
           tail->next = q;
       }
       p = p->next;
    }
}

void display(struct node *head)
{
    int num = 0;
    node *p;
    p = head->next;
    while ( p )
    {
        num++;
        printf ( num != 10 ? "%d/%d\t" : "%d/%d", p->erator, p->minator );
        p = p->next;
        if ( num == 10 )
        {
            printf ( "\n" ) ;
            num = 0;
        }
    }
}

int main()
{
    int n;
    First_inti();
    scanf ( "%d", &n );
    for ( int i = 2;i <= n; i++ )
    {
        create( i );
    }
    display( head );
    return 0;
}

数据结构实验之链表九:双向链表

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

struct node
{
    int num;
    struct node *next, *pro;
};

int main()
{
    int n, m;
    scanf ( "%d %d", &n, &m );
    node *tail, *q, *p;
    node *head = new node;
    tail = head;
    while ( n-- )
    {
        p = new node;
        scanf ( "%d", &p->num );
        p->next = NULL;
        p->pro = NULL;
        tail->next = p;
        p->pro = tail;
        tail = p;
    }
    while ( m-- )
    {
        int h;
        scanf ( "%d", &h );
        if ( head->next->num == h )
        {
            printf ( "%d\n", head->next->next->num );
        }
        else if ( tail->num == h )
        {
            printf ( "%d\n", tail->pro->num );
        }
        else
        {
            q = head->next;
            while ( q->next )
            {
                if ( q->num == h )
                {
                    printf ( "%d %d\n", q->pro->num, q->next->num );
                    break;
                }
                q = q->next;
            }
        }
    }
}

代码菜鸟,如有错误,请多包涵!!!
如有帮助记得支持我一下,谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值