圥忈.425 2022-09-12 14:29 采纳率: 85.7%
浏览 662
已结题

最大值移动到最后的线性链表的结点移动

已知非空线性链表第1个链结点指针为list,链结点构造为
struct node{
datatype data;
node *link;
};
请写一算法,将该链表中数据域值最大的那个点移到链表的最后面。(假设链表中数据域值最大的链结点惟一)(注意:要求先写出算法的解题思路,然后再写出算法)

  • 写回答

1条回答 默认 最新

  • a5156520 2022-09-12 19:43
    关注

    用循环不断比较每个节点的值,如果找到最大值,则记录这个值及其节点,循环结束把尾结点的值和最大值节点的值互换即可,代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int datatype ;
    
    struct node{
        datatype data;
        node * link;
    }; 
    
    int main(void){
        
        node * list,* tmp,*pre=NULL;
            
        int i=0;
    //创建测试链表节点的测试数据
        while(i<5){
            
            
            printf("请输入链表第%d个节点的值:",i+1);
            
        
            tmp = (node*)malloc(sizeof(node));
            if(pre!=NULL){
                pre->link = tmp;
            }
            
            if(i==0){
                list = tmp;
            }
        
            scanf("%d",&tmp->data);    
            tmp->link = NULL;        
            pre = tmp;
                    
            i++;
        }
        
        //打印移动前,链表各节点的值 
        printf("移动最大值前链表各节点的值为:\n");
        tmp = list;
        while(tmp!=NULL){
            printf("%d ",tmp->data,tmp->link);
            tmp = tmp->link;
        }
        printf("\n");
        
        
        tmp = list;
        int max=tmp->data;  //把链表节点最大值赋值为链表节点第一个值 
        node* maxList=tmp,tmp2;   //最大值节点也赋值为链表第一个节点 
    //    printf("0\n");
        //i=0;
        while(tmp!=NULL){
        
            //printf("0,tmp->data=%d,tmp->link=%p\n",tmp->data,tmp->link);    
      //如果链表节点当前最大值小于当前节点的值,则把最大值赋值为当前节点的值,最大值节点也赋值为当前节点         
            if(max<tmp->data){ 
            //    printf("tmp->data=%d,max=%d\n",tmp->data,max);
                max = tmp->data;
                maxList = tmp;
                
            }
        //    i++;
        //    printf("i=%d\n",i);
            pre = tmp;  //记录当前节点,以便循环结束记录到链表节点的尾结点 
            tmp = tmp->link;
        }
        
    //    printf("1-1,maxList=%p,pre=%p\n",maxList,pre);
        maxList->data = pre->data; //把最大值节点的值赋值为尾结点的值 
        pre->data = max;  //把尾结点的值赋值为最大值节点的值,实现把最大值移到节点的最后面的目的 
        
        //打印移动后的结果 
        printf("移动最大值后链表各节点的值为:\n");
        tmp = list;
        while(tmp!=NULL){
            printf("%d ",tmp->data);
            tmp = tmp->link;
        }
        printf("\n");
        
        
        return 0; 
        
    }
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 10月5日
  • 已采纳回答 9月27日
  • 创建了问题 9月12日

悬赏问题

  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 angular开发过程中,想要读取模型文件,即图1的335行,会报404错误(如图2)。但我的springboot里配置了静态资源文件,如图3。且在该地址下我有模型文件如图4,请问该问题该如何解决呢?
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了
  • ¥100 H5网页如何调用微信扫一扫功能?
  • ¥15 讲解电路图,付费求解
  • ¥15 有偿请教计算电磁学的问题涉及到空间中时域UTD和FDTD算法结合的
  • ¥15 vite打包后,页面出现h.createElement is not a function,但本地运行正常
  • ¥15 Java,消息推送配置