解题思路: 建立链表,插入数据,保证数据有序,最后直接遍历输出,总体还是很好理解的。

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;
    }
}