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

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日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装