数据结构上机测试1:顺序表的应用
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
在长度为n(n<1000)的顺序表中可能存在着一些值相同的“多余”数据元素(类型为整型),编写一个程序将“多余”的数据元素从顺序表中删除,使该表由一个“非纯表”(值相同的元素在表中可能有多个)变成一个“纯表”(值相同的元素在表中只能有一个)。
输入
第一行输入表的长度n;
第二行依次输入顺序表初始存放的n个元素值。
第二行依次输入顺序表初始存放的n个元素值。
输出
第一行输出完成多余元素删除以后顺序表的元素个数;
第二行依次输出完成删除后的顺序表元素。
第二行依次输出完成删除后的顺序表元素。
示例输入
12 5 2 5 3 3 4 2 5 7 5 4 3
示例输出
5 5 2 3 4 7
提示
用尽可能少的时间和辅助存储空间。
顺序表是我学习数据结构里第一个部分,用到了链表的知识,这个删除重复元素就是先顺序建立一个顺序表,然后从头开始,设置前后相邻的两个指针,并比较,如果相同,就删除重复元素,否则两个指针都向后移动一个,继续比较,一直到顺序表的最后,这样得到的顺序表就是删掉重复元素之后的了。
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
int i,n,t=0;
struct node *head,*p,*q,*d,*tail;
scanf("%d",&n);
head=(struct node*)malloc(sizeof(struct node));
head->next=NULL;
tail=head;
for(i=0; i<n; i++)
{
q=(struct node*)malloc(sizeof(struct node));
scanf("%d",&q->data);
q->next=NULL; //顺序建链表
tail->next=q;
tail=q;
}
d=head->next;
while(d!=NULL)
{
p=d;
q=p->next;
while(q!=NULL)
{
if(d->data==q->data)
{
t++;
p->next=q->next; //删除元素
q=q->next;
}
else
{
p=q;
q=q->next;
}
}
d=d->next;
}
printf("%d\n",n-t);
p=head->next;
while(p!=NULL)
{
printf("%d",p->data);
if(p->next!=NULL)
printf(" ");
p=p->next;
}
printf("\n");
return 0;
}