一种常规的解体思路,可以避免题目出得不周全而出现的bug

题目描述
数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开

输出描述:
输出合并后的键值对(多行)

示例1
输入:
4
0 1
0 2
1 2
3 4
输出:
0 3
1 2
3 4

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

struct tab
{
    int index;
    int value;
};

int main(void)
{
    int i,j,tab_num, k;
    struct tab tmp, *p;

    //输入的数据量
    scanf("%d",&tab_num);

    //存放输入数据
    p = malloc(sizeof(struct tab) * tab_num);
    if(!p)
    {
        printf("没有足够的内存使用");
        return -1;
    }

    //记录输入数据并合并相同的索引
    for(i = 0,k = 0; i < tab_num; i++)
    {
        scanf("%d%d", &tmp.index, &tmp.value);

        if (i == 0)
        {
            p[0].value = tmp.value;
            p[0].index = tmp.index;
            k++;
        }
        else
        {
            for(j = 0; j < k; j++)
            {
                if(p[j].index == tmp.index)
                {
                    //相同的索引合并
                    p[j].value += tmp.value;
                    break;
                }
            }
            if(j >= k)
            {
                //不同的添加的后面
                p[k].value = tmp.value;
                p[k].index = tmp.index;
                k++;    //记录使用的结构体数组的下标
            }

        }
    }

    //排序
    for(i = 0; i < k; i ++)
    {
        tmp = p[i];
        for(j = i + 1; j < k; j++)
        {
            if( p[j].index < p[i].index)
            {
                //只要比i位置的小,则进行交换
                tmp = p[j];
                p[j] = p[i];
                p[i] = tmp;
            }
        }
    }

    //输出
    for(i = 0; i < k;  i++)
    {
        printf("%d %d\n",p[i].index, p[i].value);
    }

    //用完释放申请的内存
    free(p);

    return 0;
}