题目描述
在长度为n(n<1000)的顺序表中可能存在着一些值相同的“多余”数据元素(类型为整型),编写一个程序将“多余”的数据元素从顺序表中删除,使该表由一个“非纯表”(值相同的元素在表中可能有多个)变成一个“纯表”(值相同的元素在表中只能有一个)。
输入
第一行输入表的长度n;
第二行依次输入顺序表初始存放的n个元素值。
第二行依次输入顺序表初始存放的n个元素值。
输出
第一行输出完成多余元素删除以后顺序表的元素个数;
第二行依次输出完成删除后的顺序表元素。
第二行依次输出完成删除后的顺序表元素。
示例输入
12
5 2 5 3 3 4 2 5 7 5 4 3
12 5 2 5 3 3 4 2 5 7 5 4 3
示例输出
5
5 2 3 4 7
5 5 2 3 4 7
提示
用尽可能少的时间和辅助存储空间。
既然要求用最少的辅助存储空间,那就用链表实现吧。
#include<stdio.h>
#include<stdlib.h>
struct hh
{
int data;
struct hh *next;
};
void main()
{
struct hh *p,*head,*t,*q;
int n,i,j,s,flag;
head=(struct hh *)malloc(sizeof(struct hh));
head->next=NULL;
t=head;
scanf("%d",&n);
for(i=0;i<n;i++)
{
p=(struct hh *)malloc(sizeof(struct hh));
scanf("%d",&p->data);
p->next=t->next;
t->next=p;
t=p;
}
p=head->next;
t=p->next;
s=1;
while(t!=NULL)
{
flag=0;
q=head->next;
for(i=0;i<s;i++)
{
if(t->data==q->data)
{
p->next=t->next;
free(t);
t=p->next;
flag=1;
n--;
break;
}
else
q=q->next;
}
if(flag==0)
{
s++;
t=t->next;
p=p->next;
}
}
p=head->next;
printf("%d\n",n);
for(i=1;i<s;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("%d\n",p->data);
}
本文介绍了一个使用链表实现的高效算法,旨在从整数顺序表中移除所有重复的元素,将其转换为每个元素仅出现一次的纯表。通过逐步解析代码逻辑,展示了如何在限制时间和空间复杂度的前提下完成这一任务。

被折叠的 条评论
为什么被折叠?



