/**
从链表出摘除m个结点,
并把各结点数值依次放在dest中,
把实际摘除的结点数放在n中
*/void removeElems(Link& L, int dest[], int m, int& n)
{
if(m <= 0)
{
n = 0;
return;
}
int i = 0;
Link p = L;
Link temp;
while(p && i < m)
{
dest[i]= p->elem;
i++;
temp = p->next;
dele
te p;
p = temp;
}
L = p;
n = i;
}
完整实现
#include <iostream>#include <stdlib.h>#include <stdio.h>#include <iomanip>usingnamespacestd;
typedefstruct LINK
{
int elem;
LINK* prior;
LINK* next;
}*Link, Node;
void insertElem(Link& L, int e);
void removeElems(Link& L, int dest[], int m, int& n);
void printElems(Link L);
void printChoice(int dest[], int e, int n);
int main()
{
Link L = NULL;
int e;
int n = 0;
while(true)
{
cout<<"请输入文件大小(非正数表示输入结束):";
cin>>e;
if(e <= 0)
break;
insertElem(L, e);
n++;
}
if(n < 2)
{
cout<<"无需归并"<<endl;
return0;
}
cout<<"请输入归并路数:";
cin>>e;
if(e <= 1)
{
cout<<"归并路数必须为大于1的整数"<<endl;
return0;
}
int* dest = newint[e];
//补0while(e > 2)
{
if(n % (e-1) == 1)
break;
insertElem(L, 0);
n++;
}
cout<<endl<<"序列 选择 花费"<<endl;
int i;
for(i = 0; i < 80; i++)
cout<<'*';
cout<<endl;
int size;
int total = 0;
while(true)
{
printElems(L);
removeElems(L, dest, e, n);
if(n < e)
{
cout<<endl;
for(i = 0; i < 80; i++)
cout<<'*';
cout<<endl;
cout<<"归并完成,最终文件序列:"<<endl;
cout<<dest[0]<<endl;
cout<<"总花费:"<<total;
break;
}
else
{
printChoice(dest, e, n);
size = 0;
while(n > 1)
{
size += dest[e-n];
n--;
}
size += dest[e-n];
total += size;
cout<<size<<endl<<endl;
insertElem(L, size);
}
}
return0;
}
/**
在链表中插入新结点
*/void insertElem(Link& L, int e)
{
Link pNode = new Node();
pNode->elem = e;
if(!L)
{
L = pNode;
pNode->prior = NULL;
pNode->next = NULL;
return;
}
Link p = L;
while(p)
{
if(p->elem >= e)
{
pNode->prior = p->prior;
pNode->next = p;
if(p == L)
{
L = pNode;
p->prior = NULL;
}
else
{
p->prior->next = pNode;
}
p->prior = pNode;
return;
}
if(!p->next)
{
p->next = pNode;
pNode->prior = p;
pNode->next = NULL;
return;
}
p = p->next;
}
}
/**
从链表出摘除m个结点,
并把各结点数值依次放在dest中,
把实际摘除的结点数放在n中
*/void removeElems(Link& L, int dest[], int m, int& n)
{
if(m <= 0)
{
n = 0;
return;
}
int i = 0;
Link p = L;
Link temp;
while(p && i < m)
{
dest[i] = p->elem;
i++;
temp = p->next;
delete p;
p = temp;
}
L = p;
n = i;
}
/**
打印链表
*/void printElems(Link L)
{
Link p = L;
string elems;
char* temp = newchar[20];
while(p)
{
sprintf(temp, "%d", p->elem);
elems.append(temp);
if(p->next)
elems.append(", ");
elsebreak;
p = p->next;
}
int len = elems.length();
int i = 0;
while(len > 34)
{
cout<<setw(36)<<left<<elems.substr(i, 34)<<endl;
i += 34;
len -= 34;
}
cout<<setw(36)<<left<<elems.substr(i, len);
delete temp;
}
/**
打印所选结点值数组
*/void printChoice(int dest[], int e, int n)
{
string choiceStr;
char* temp = newchar[20];
while(n > 1)
{
sprintf(temp, "%d", dest[e-n]);
choiceStr.append(temp);
choiceStr.append(", ");
n--;
}
sprintf(temp, "%d", dest[e-n]);
choiceStr.append(temp);
int len = choiceStr.length();
int i = 0;
while(len > 34)
{
cout<<setw(36)<<left<<choiceStr.substr(i, 34)<<endl;
i += 34;
len -= 34;
}
cout<<setw(36)<<left<<choiceStr.substr(i, len);
delete temp;
}