解题思路: 建立链表,插入数据,保证数据有序,最后直接遍历输出,总体还是很好理解的。
struct listNode{
int index;
int value;
struct listNode *next;
};
static void insert(struct listNode *head,int index,int value)
{
struct listNode *newa=( struct listNode *)malloc(sizeof(struct listNode));
newa->index=index;
newa->value=value;
newa->next=NULL;
struct listNode *ltmp=head;
struct listNode *p=head;
while(p!=NULL)//遍历链表
{
if(p->index==index){ //如果链表存在index就直接赋值累加
p->value+=value;
free(newa);
newa=NULL;
return;
}
if(p->index<index){ //insert元素大于当前节点元素,继续向后遍历
ltmp=p;//需要保留当前指针,后续使用修改指向
p=p->next;
continue;
}
if(p->index>index)//insert元素小于于当前节点元素,插入数据
{
ltmp->next=newa;
newa->next=p;
break;
}
p=p->next;
}
if(p==NULL)//如果遍历完链表,说明数据未插入,直接放入末端。
{
ltmp->next=newa;
}
}
int main(void)
{
int num;
scanf("%d",&num);
//定义链表头部 index与value==-1
struct listNode *diclist=( struct listNode *)malloc(sizeof(struct listNode));
diclist->value=-1;
diclist->index=-1;
diclist->next=NULL;
int tmp_v,tmp_i;
for(int i=0;i<num;i++)
{
scanf("%d %d",&tmp_i,&tmp_v);
insert(diclist,tmp_i,tmp_v);
}
//从头部节点下个元素开始遍历
struct listNode *p1=diclist->next;
while(p1!=NULL)
{
printf("%d %d\n",p1->index,p1->value);
p1=p1->next;
}
}