查找链表最大值&&链表排序

输入一个数列以0位结束标志,建立链式线性表,查找其中最大的数并输出删除释放节点,然后对剩余的进行排序,并输出释放节点。

分步骤解决:
1)初始化链表,建立头结点
2)根据输入建立链表 link *Create(link *l),此处采用尾插法即可,直接在Create函数中输入并以此插入到尾节点后
3)查找出最大值并从链表中删除之link *Find_delete_max(link *l)
4)最有难度的一个,在已存在链表的基础上进行排序操作,这里采用的是类似于冒泡算法排序:void Sort(link *l)不交换指针,只交换数据
5)输出释放节点void print_free(link *l)
代码:

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef struct link{
    int data;
    link *next;
}link;

link *Initlink(){
    link *l;
    l=(link*)malloc(sizeof(link));
    l->next=NULL;
    return l;
}

link *Create(link *l){
    int x;
    link *tail=l;
    while(cin>>x){
        if(x==0){
            break;
        }
        else{
            link *s=(link*)malloc(sizeof(link));
            s->data=x;
            s->next=NULL;
            tail->next=s;
            tail=s;
        }
    }
    return l;

}

link *Find_delete_max(link *l){
    int maxdata=0;
    link *prep=l,*p=l->next,*pmax,*prepmax;
    while(p){
        if(maxdata<p->data){
            maxdata=p->data;
            pmax=p;
            prepmax=prep;
        }
        prep=p;p=p->next;
    }
    cout<<maxdata<<endl;
    prepmax->next=pmax->next;
    free(pmax);
    return l;

}

void Sort(link *l){
    link *p=l->next,*cur;
    while(p->next){
        cur=p->next;
        while(cur){
            if(p->data>cur->data){
                int temp=p->data;
                p->data=cur->data;
                cur->data=temp;
            }
            cur=cur->next;
        }
        p=p->next;
    }
}

void print_free(link *l){
    link *prep=l,*p=l->next;
    while(p){
        link *q=p;
        cout<<q->data<<" ";
        p=p->next;
        prep->next=p;
        free(q);
    }
    cout<<endl;
}
int main()
{
    link *l=Initlink();
    l=Create(l);
    l=Find_delete_max(l);
    Sort(l);
    print_free(l);
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值