网址:http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=2264

这道题写的有点恼火,题本身其实非常简单,但是最后因为输出格式的原因交了两三次,因为每个要删除的节点并没有实际删除。

   如果用单链表的话就不会出现这种情况。

#include<stdio.h>
#include<string.h>
struct node
{
    char data[50];
    int num;
    int vis;
}title[100];
int main()
{
    int n,i;
    scanf("%d",&n);
    int sum;
    for(i = 0; i < n; i++)
    {
        char str[10];
        sum = 0;
        int  x = 1000;
        while(1)
        {
            scanf("%s",str);
            if(!strcmp(str,"End"))
                break;
            if(!strcmp(str,"Add"))
            {
                scanf("%s",str);
                strcpy(title[sum].data,str);
                title[sum].num = x;
                //初始化都为1
                title[sum].vis = 1; 
                x++;
                sum++;
            }
            if(!strcmp(str,"Delete"))
            {
                scanf("%s",str);
                int j;
                for(j = 0; j < sum; j++)
                    if(!strcmp(str,title[j].data))
                        //并没有真正删除 只是将删除的数标记为0
                        title[j].vis = 0;    
            }
        }
        int k;
        //先找见第一个没有删除的元素 单独输出
        for(k = 0; k < sum; k++)
        {
            if(title[k].vis == 1)
            {
                printf("%d",title[k].num);
                break;
            }
        }
        for(k = k + 1; k < sum; k++)
        {
            if(title[k].vis == 1)
            {
                printf(" %d",title[k].num);
            }
        }
        printf("\n");
        for(k = 0; k < sum; k++)
        {
            if(title[k].vis == 1)
            {
                printf("%s",title[k].data);
                break;
            }
        }
        for(k = k + 1; k < sum; k++)
        {
            if(title[k].vis == 1)
            {
                printf(" %s",title[k].data);
            }
        }
        printf("\n");
    }
    return 0;
}