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 用matlab求微分方程初值问题
  • ¥15 vscode下编写第三方库opencv与pcl代码时没有代码提示
  • ¥15 能够跑通不报错,如何解决?(标签-matlab)
  • ¥15 MOS在RDS较大,频率高时开关波形异常
  • ¥15 SCENIC分析报错求解答
  • ¥15 ceph初始化mon不成功 下图不报错 这个是什么元
  • ¥15 数学建模数学建模少ai
  • ¥35 这个等效电路图是什么意思?(答疑)(有没有不是chat的,我就是在chat搜不到才来问的,chat还开了VIP)(可以追加酬金)
  • ¥200 基于同花顺supermind的量化策略脚本编辑
  • ¥15 黄永刚的晶体塑性子程序中输入的材料参数里的晶体取向参数是什么形式的?