输入一个数列以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;
}