Bella_Notte 2023-03-20 21:07 采纳率: 88.9%
浏览 212
已结题

C语言线性链表的结点移动

【问题描述】
已知非空线性链表第1个链结点指针为list,链结点构造为

struct node{
    datatype data;
    node *link;
};

请写一算法,将该链表中数据域值最大的那个点移到链表的最后面。(假设链表中数据域值最大的链结点惟一)(注意:要求先写出算法的解题思路,然后再写出算法)
【输入形式】
输入为一个整数序列,整数之间以空格隔开,序列以回车结尾。
【输出形式】
输出为移动后的整数序列,整数之间以空格隔开,序列以回车结尾。
【样例输入】
3 12 4 9 5 1
【样例输出】
3 4 9 5 1 12
【样例说明】
将序列中最大的数字12移动到序列最后。

我的思路:
1.先遍历链表找出那个最大值
2.尾插最大值
3.删最大值对应结点
代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int datatype;
typedef struct node {
    datatype data;
    struct node* link;
}node;

node* BuySLTNode(datatype x)
{
    node* newnode = (node*)malloc(sizeof(node));
    if (newnode == NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    newnode->data = x;
    newnode->link = NULL;
    return newnode;
}

node* CreateSList()
{
    datatype data;
    node* phead = NULL, *ptail = NULL;
    while(1)
    {
        scanf("%d", &data);
        if (getchar() == '\n')
        {
            break;
        }
        node* newnode = BuySLTNode(data);
        if (phead == NULL)
        {
            ptail = phead = newnode;
        }
        else
        {
            ptail->link = newnode;
            ptail = newnode;
        }
    }

    return phead;
}

node* Find_max(node* phead)
{
    node* cur = phead;
    node* Max = phead;
    datatype max = cur->data;
    while (cur)
    {
        if (cur->data > max)
        {
            max = cur->data;
            Max = cur;
        }
        cur = cur->link;
    }
    return Max;
}

void SListErase(node** pphead, node* pos)
{
    assert(pos);
    assert(*pphead);
    if (pos == *pphead)
    {
        node* next = (*pphead)->link;
        free(*pphead);
        *pphead = next;
    }
    else
    {
        node* prev = *pphead;
        while (prev->link != pos)
        {
            prev = prev->link;
        }
        prev->link = pos->link;
        free(pos);
    }
}
void SLTPushBack(node** pphead, datatype x)
{
    node* newnode = BuySLTNode(x);
    if (*pphead == NULL)
    {
        *pphead = newnode;
    }
    else
    {
        node* tail = *pphead;
        //找尾
        while (tail->link)
        {
            tail = tail->link;
        }
        tail->link = newnode;
    }
}

void SLTPrint(node* phead)
{
    node* cur = phead;
    while (cur)
    {
        printf("%d", cur->data);
        cur = cur->link;
    }
}


int main()
{
    node* plist = (node*)malloc(sizeof(node));
    plist = CreateSList();
    node* max = Find_max(plist);
    SLTPushBack(plist, max->data);
    SListErase(plist, max);
    SLTPrint(plist);
    return 0;
}

但是打印结果如下:

img

试图调试的时候发现:

img

不知道是哪里出错了 希望得到帮助 非常感谢

  • 写回答

4条回答 默认 最新

  • qzjhjxj 2023-03-21 13:08
    关注

    代码没什么大问题,改动处见注释,完善如下,供参考:

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    typedef int datatype;
    typedef struct node {
        datatype data;
        struct node* link;
    }node;
    
    node* BuySLTNode(datatype x)
    {
        node* newnode = (node*)malloc(sizeof(node));
        if (newnode == NULL)
        {
            perror("malloc fail");
            exit(-1);
        }
        newnode->data = x;
        newnode->link = NULL;
        return newnode;
    }
    
    node* CreateSList()
    {
        datatype data;
        node* phead = NULL, * ptail = NULL;
        while (1)
        {
            scanf("%d", &data); //修改  
            node* newnode = BuySLTNode(data);
            if (phead == NULL)
                phead = newnode;//修改 
            else
                ptail->link = newnode;
            ptail = newnode;   //修改 
            if ((getchar()) == '\n')  break; //修改
        } 
        return phead;
    }
    
    node* Find_max(node* phead)   
    {
        node* cur = phead;
        node* Max = phead;
        datatype max = cur->data;
        while (cur)
        {
            if (cur->data > max)
            {
                max = cur->data;
                Max = cur;
            }
            cur = cur->link;
        }
        return Max;
    }
    
    void SListErase(node** pphead, node* pos) 
    {
        assert(pos);
        assert(*pphead);
        if (pos == *pphead)
        {
            node* next = (*pphead)->link;
            free(*pphead);
            *pphead = next;
        }
        else
        {
            node* prev = *pphead;
            while (prev->link != pos)
            {
                prev = prev->link;
            }
            prev->link = pos->link;
            free(pos);
        }
    }
    void SLTPushBack(node** pphead, datatype x) 
    {
        node* newnode = BuySLTNode(x);
        if (*pphead == NULL)
        {
            *pphead = newnode;
        }
        else
        {
            node* tail = *pphead;
            //找尾
            while (tail->link)
            {
                tail = tail->link;
            }
            tail->link = newnode;
        }
    }
    
    void SLTPrint(node* phead)
    {
        node* cur = phead;
        while (cur)
        {
            printf("%d ", cur->data); //修改
            cur = cur->link;
        }
    }
    
    int main()
    {
        node* plist = NULL;   //(node*)malloc(sizeof(node)); 修改
        plist = CreateSList();
        node* max = Find_max(plist);   
        SLTPushBack(&plist, max->data); //修改 SLTPushBack(plist, max->data);
        SListErase(&plist, max);        //修改 SListErase(plist, max);
        SLTPrint(plist);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月29日
  • 已采纳回答 3月21日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)