写在前面:
这题我自己的做法并没有AC,只拿了7分,超时了…听同学说这题要用静态链表做,好家伙,没学到呢,超纲了…
记录一下我的while while 暴力辣鸡做法,等我学了静态链表就回来补上AC代码(Skr)。
所以想看10分代码的伙伴建议百度。
7分超时辣鸡代码:
#include<iostream>
#include<math.h>
using namespace std;
typedef struct LNode
{
string locate_now;
int num;
string locate_next;
struct LNode *next;
bool check=0;
}LNode,*LinkList;
//创建初始链表
string createFirstList(LinkList &L,int &m)
{
L=new LNode;
L->next=NULL;
LinkList r=L;
string fl;//记录首地址
int n;
cin>>fl>>n;
m=n;
string locate_now;
int num;
string locate_next;
while(n--)
{
LinkList p=new LNode;
cin>>locate_now>>num>>locate_next;
p->locate_now=locate_now;
p->num=num;
p->locate_next=locate_next;
p->next=NULL;
r->next=p;
r=r->next;
}
return fl;
}
//创建排号顺序的链表
void createFinalList(LinkList s1,LinkList &s2,string fl,int num)
{
s2=new LNode;
LinkList p2=s2,p1=s1->next;
//找第一个
while(p1)
{
if(p1->locate_now==fl) break;
p1=p1->next;
}
LinkList s=new LNode;
s->locate_now=p1->locate_now;
s->locate_next=p1->locate_next;
s->num=p1->num;
s->next=NULL;
p2->next=s;
p2=s;
//生成重复的链表
num--;
while(num--)
{
p1=s1->next;
//找
while(p1)
{
if(p1->locate_now==p2->locate_next) break;
p1=p1->next;
}
LinkList s0=new LNode;
s0->locate_next=p1->locate_next;
s0->locate_now=p1->locate_now;
s0->num=p1->num;
s0->next=NULL;
p2->next=s0;
p2=p2->next;
}
}
//生成两个最终链表
void createTwo(LinkList s2,LinkList &s3,LinkList &s4)
{
s3=new LNode;
s4=new LNode;
LinkList p3=s3,p4=s4,p2=s2->next->next,p22=s2->next;//p22是查重指针
//s3的第一个是s2的第一个,第一个不会重复
LinkList temp=new LNode;
temp->locate_now=p22->locate_now;
temp->num=p22->num;
temp->next=NULL;
p3->next=temp;
p3=temp;
while(p2)
{
//查重
p22=s2->next;
int flag=0;
while(p22)
{
if(p22->check==1) continue;
if(p22==p2) break;
if(abs(p22->num)==abs(p2->num))
{
flag=1;
break;
}
p22=p22->next;
}
//不重复
if(flag==0)
{
LinkList temp1=new LNode;
temp1->locate_now=p2->locate_now;
temp1->num=p2->num;
temp1->next=NULL;
p3->next=temp1;
p3=temp1;
p3->check=1;
}
//重复
else
{
LinkList temp1=new LNode;
temp1->locate_now=p2->locate_now;
temp1->num=p2->num;
temp1->next=NULL;
p4->next=temp1;
p4=temp1;
p4->check=1;
}
p2=p2->next;
}
//后结点地址的设置
p3=s3->next;
p4=s4->next;
while(p3)
{
if(p3->next) p3->locate_next=p3->next->locate_now;
else p3->locate_next="-1";
p3=p3->next;
}
while(p4)
{
if(p4->next) p4->locate_next=p4->next->locate_now;
else p4->locate_next="-1";
p4=p4->next;
}
}
int main()
{
LinkList s1,s2,s3,s4;
int num;
string fl=createFirstList(s1,num);//num是总结点的个数
createFinalList(s1,s2,fl,num);//s2是排号顺序的列表 但是重复
createTwo(s2,s3,s4);
LinkList p3=s3->next,p4=s4->next;
while(p3)
{
cout<<p3->locate_now<<" "<<p3->num<<" "<<p3->locate_next<<endl;
p3=p3->next;
}
while(p4)
{
cout<<p4->locate_now<<" "<<p4->num<<" "<<p4->locate_next;
if(p4->next) cout<<endl;
p4=p4->next;
}
return 0;
}
下次一定AC然后把这博客完善了。