本题我用了链表,大致思路是在读到一个数的时候就插入链表中,当读取到一个链表中已有的数时,就删除这个数,这样链表不会太长。便于插入和删除操作
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;//数据域
struct node *next;
}linklist;
void locate(linklist *L, int x);
void dele(linklist *pre, linklist *p, int x);
void insert(linklist *L, int x);
int main()
{
int n, x, i;
linklist *L;
L = (linklist *)malloc(sizeof(linklist));
L->next = NULL;//带头结点的单链表
scanf("%d", &n);
while (n)
{
for (i = 0; i < n; i++)
{
scanf("%d", &x);
locate(L, x);//在链表中查找该数据
}
printf("%d\n", L->next->data);//所有出现偶数次的都被删除,最后剩下的那个就是我们要找的
scanf("%d", &n);
}
}
void locate(linklist *L, int x)
{
linklist *p = L->next, *pre = L;//pre记住p前面的结点,便于删除操作
while (p)
{
if (p->data == x)
break;
pre = p;//一直往下找
p = p->next;
}
if (!p)
{
insert(L, x);//如果链表中不存在该数就插入链表中
}
else
{
dele(pre, p, x);//如果存在就删除
}
}
void insert(linklist *L, int x)//插入操作
{
linklist *p;
p = (linklist *)malloc(sizeof(linklist));
p->next = NULL;
p->data = x;
p->next = L->next;
L->next = p;
}
void dele(linklist *pre, linklist *p, int x)//删除操作
{
pre->next = pre->next->next;
free(p);
}