思路:先升序排列,将排好的数组尾插创建链表,每次选择前两个节点,相加生成新的节点,插入有序指点地方,直到没节点可选。(最小生成树)
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next;
}LNode;
typedef struct stack{
int count;
struct node *head;
}Stack;
void sort(int r[],int n){//冒泡排序
int i,j,t;
for(i=1;i<=n;++i){
for(j=0;j<n-i;++j){
if(r[j]>r[j+1]){t=r[j];r[j]=r[j+1];r[j+1]=t;}
}
}
}
int main(int argc,char * argv[]){
int n;
while(scanf("%d",&n)!=EOF){
int i,len[n],sum=0;
for(i=0;i<n;++i) scanf("%d",&len[i]);
sort(len,n);
//for(i=0;i<n;++i) printf("%d “,len[i]);
Stack stack;
stack=(Stack)malloc(sizeof(Stack));
stack->count=n;
stack->head=NULL;
LNode *node,p,q;
node=(LNode)malloc(sizeof(LNode));
node->data=-1;
node->next=NULL;
stack->head=node;
p=stack->head;
for(i=0;i<n;++i){//尾插法创建链表
q=(LNode)malloc(sizeof(LNode));
q->data=len[i];
q->next=p->next;
p->next=q;
p=q;
}
p=stack->head;
while(p->next!=NULL){
i=0;
int a[2]={0};
while(i<2){//选取前两个节点
LNode *k;
k=p->next;
a[i++]=k->data;
p->next=k->next;
free(k);
}
sum+=a[0]+a[1];
if(p->next!=NULL){
LNode t;//两个节点之和生成新节点
t=(LNode)malloc(sizeof(LNode));
t->data=a[0]+a[1];
t->next=NULL;
q=p;
while(q!=NULL){
if(q->next==NULL){t->next=q->next;q->next=t;break;}
if(t->datanext->data){t->next=q->next;q->next=t;break;}
q=q->next;
}
}
}
printf(”%d\n",sum);
}
return 0;
}