SDUTACMデータ構造のオンラインテスト1:順序表の応用

2468 ワード

タイトルの説明



長さn(n<1000)のシーケンステーブルには、同じ値の「余分」データ要素(タイプが整数)が存在する可能性があります.プログラムを作成して、「余分」データ要素をシーケンステーブルから削除し、テーブルを1つの「非純粋テーブル」(同じ値の要素がテーブルに複数ある可能性がある)から1つの「純粋テーブル」(同じ値の要素がテーブルに1つしかない)にします.

入力



第1行入力テーブルの長さn;
2行目には、シーケンステーブルに最初に格納されたn個の要素値が順次入力されます.

しゅつりょく



第1行の出力が完了した余分な要素削除後の順序テーブルの要素数.
2行目は、削除が完了したシーケンステーブル要素を順次出力します.

サンプル入力


12
5 2 5 3 3 4 2 5 7 5 4 3

サンプル出力


5
5 2 3 4 7

ヒント


可能な限り少ない時間とセカンダリストレージスペースを使用します。


最小限のアシストストレージが要求される以上、チェーンテーブルで実現しましょう.
#include
#include
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;idata);
		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;idata==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); for(i=1;idata); p=p->next; } printf("%d
",p->data); }