数据结构 实验二

代码可能有点长,想学习的小伙伴可以细读哟,不懂也可以问博主哟

愿所有想学习的帅哥美女都能学懂(一开始接触我也很懵逼)

我当初就是靠这个视频理解的yo,真的值得学习。

【数据结构】链表->头插法_哔哩哔哩_bilibili

1.实验目的(结出本次实验所涉及并要求掌握的知识点)

1.熟悉掌握动态链表结构及有关算法的设计方法.

2.理解不带头结点的单链表的特点,掌握其基本操作.

3.熟练掌握运用不带头结点链表表示特定形式的数据的方法,并设计出有关算法.

2.实验内容(结出实验内容具体描述)

1.编写函数linklist delx(linklist head,datatype x);删除不带头结点单链表head中第一个值为x的节点,并构造样例调试.

2.用不带头结点的单链表储存线性表,请设计算法函数linklist reverse1(node* head)和void reverse2(node** head)将其倒置,并构造样例调试

3.假设不带头结点的单链表head是升序排列,设计算法函数linklist insert(linklist head,datatype x);将值为x的结点插入到链表head中,保持其有序性,分别构造插入到表头、表中和表尾3种情况进行调试。

4.编写算法函数linklist delallx(node* head,datatype x);删除不带头结点单链表中所有值为x的结点。

3.算法描述及实验步骤(用适当的形式表达算法设计思想与算法实现步骤)

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef int datatype;
typedef struct node_
{
    datatype data;
    struct node_ *next;

} node;
typedef node *linklist;

linklist createbystack()
{ //无头结点的头插法;
    node *head, *s;
    datatype x;
    head = NULL;
    cout << "请输入若干数据,以0为结束符" << endl;
    cin >> x;
    while (x)
    {
        s = (node *)malloc(sizeof(node));
        s->data = x;
        s->next = head;
        head = s;
        cin >> x;
    }
    return head;
}

linklist createbyqueue() //无头结点的尾插法
{
    node *head = NULL;
    node *p;
    node *s;
    datatype x;
    cout << "请输入若干数据,以0为结束符" << endl;
    cin >> x;
    while (x)
    {
        p = (node *)malloc(sizeof(node));
        p->data = x;
        if (!head)
        {
            head = p;
            s = head;
        }
        else
        {
            s->next = p;
            s = p;
        }
        cin >> x;
    }
    s->next = NULL;
    return head;
}

void output(node *head)
{
    node *p = head;
    int i = 0;
    if (!p)
    {
        cout << "空的" << endl;
    }
    while (p)
    {
        cout << p->data << ' ';
        p = p->next;
        i++;
        if (i % 10 == 0)
            cout << endl;
    }
    cout << endl;
}

void dellist(node *head)
{
    node *p = head;
    while (p)
    {
        p = p->next;
        free(head);
        head = p;
    }
}

linklist delx(node *head, datatype x) //先找到x的位置,再利用p及其前节点s修改s节点的指向,再释放删除节点的内存,
//对于第一个节点特殊处理
{
    node *p = head;
    node *s;
    while (p && p->data != x)
    {
        s = p;
        p = p->next;
    }
    if (p == NULL)
    {
        cout << "链表中无值为x的数" << endl;
        return head;
    }
    else if (head->data == x)
    {
        head = head->next;
        free(p);
        return head;
    }
    else
    {
        s->next = p->next;
        free(p);
        return head;
    }
}

linklist reverse1(node *head) //利用头插法原理进行倒置,修改指针指向.
{
    node *p = head;
    node *s;
    head = NULL;
    while (p)
    {
        s = p->next;
        p->next = head;
        head = p;
        p = s;
    }
    return head;
}

void reverse2(node **head) //也是头插法,由head此时为结构体指针的指针,(*head)即为原结构体的指针,
//通过修改(*head)来改变原链表的指向,由于是通过指针的地址修改这个实际指针指向,故无需返回.
{
    node *p = (*head);
    node *s;
    (*head) = NULL;
    while (p)
    {
        s = p->next;
        p->next = (*head);
        (*head) = p;
        p = s;
    }
}

linklist insert(node *head, datatype x) //比较大小找到要插入的位置,由前后两节点连接.对于第一个节点特殊处理.
{
    node *p = head;
    node *s = head;
    node *temp = (node *)malloc(sizeof(node));
    temp->data = x;
    if (head->data >= x)
    {
        temp->next = head;
        head = temp;
        return head;
    }
    p = p->next;
    while (p && p->data < x)
    {
        s = s->next;
        p = p->next;
    }
    s->next = temp;
    temp->next = p;
    return head;
}

linklist delallx(node *head, datatype x) //一个个找x的值,找到清除,直至遍历完整个链表,第一个特殊处理.
{
    node *p = head;
    node *s;
    node *r;
    while (p)
    {
        if (head->data == x)
        {
            head = head->next;
            s = p;
            p = p->next;
        }
        else if (p->data == x)
        {
            r = p;
            s->next = p->next;
            p = p->next;
            free(r);
        }
        else
        {
            s = p;
            p = p->next;
        }
    }
    return head;
}

int main()
{
    // datatype x;
    // node *head;
    // head = createbyqueue();
    // output(head);
    // cout << "请输入要删除的值:";//第一个实验
    // cin >> x;
    // head = delx(head, x);
    // output(head);
    // dellist(head);
    // system("pause");

    // datatype x;
    // node *head;
    // head = createbystack();
    // output(head);
    // head = reverse1(head);
    // output(head);
    // reverse2(&head);//第二个实验
    // output(head);
    // dellist(head);
    // system("pause");

    // datatype x;
    // node *head;
    // cout << "请输入一组升序排列的数" << endl;
    // head = createbyqueue();
    // output(head);
    // cout << "请输入要插入的值:";//第三个实验
    // cin >> x;
    // head = insert(head, x);
    // output(head);
    // dellist(head);
    // system("pause");

    // datatype x;
    // node *head;
    // head = createbyqueue();
    // output(head);
    // cout << "请输入要删除的数:";//第四个实验
    // cin >> x;
    // head = delallx(head, x);
    // output(head);
    // dellist(head);
    // system("pause");

    return 0;
}

4.调试过程及运行结果(详细记录在调试过程中出现的问题及解决方法。记录实验执行的结果)

实验1:

一.请输入若干数据,以0为结束符

1 2 3 4 5 6 0

1 2 3 4 5 6

请输入要删除的值:6

1 2 3 4 5

二.请输入若干数据,以0为结束符

1 2 3 4 5 6 0

1 2 3 4 5 6

请输入要删除的值:1

2 3 4 5 6

实验2:

一.

请输入若干数据,以0为结束符

1 2 3 4 5 6 0

6 5 4 3 2 1

1 2 3 4 5 6

6 5 4 3 2 1

二.

请输入若干数据,以0为结束符

0

空的

空的

空的

实验3:

一.

请输入一组升序排列的数

请输入若干数据,以0为结束符

1 2 3 4 5 6 0

1 2 3 4 5 6

请输入要插入的值:0

0 1 2 3 4 5 6

二.

请输入一组升序排列的数

请输入若干数据,以0为结束符

1 2 3 4 5 6 0

1 2 3 4 5 6

请输入要插入的值:9

1 2 3 4 5 6 9

三.

请输入一组升序排列的数

请输入若干数据,以0为结束符

1 2 3 5 6 0

1 2 3 5 6

请输入要插入的值:4

1 2 3 4 5 6

实验四:

一.

请输入若干数据,以0为结束符

2 3 6 5 2 2 2 2 0

2 3 6 5 2 2 2 2

请输入要删除的数:2

3 6 5

二.

请输入若干数据,以0为结束符

2 5 6 8 3 3 5 6 3 0

2 5 6 8 3 3 5 6 3

请输入要删除的数:3

2 5 6 8 5 6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辉哥哥哟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值