思想:
首先,创建一个非降序的链表(每次输入的数据不小于前者)
其次,遍历链表,只保留相同元素中的一个。
#include <stdio.h>
#include <stdlib.h>
typedef struct List
{
struct List *next;
int item;
}List,*link;
link init();
link orderinsert(); //创建一个非降序的链表
link LinkRepDel(link );
void show(link );
int main()
{
List *p,*q;
printf("Creat non-descending link:\n");
p = orderinsert();
show(p);
printf("The new link:\n");
q = LinkRepDel(p);
show(q);
return 0;
}
link init()
{
List *st = malloc(sizeof(st));
if(st == NULL)
printf("failure to apply for memory!");
st->next = NULL;
return st;
}
link orderinsert()
{
List *head,*st = init();
head = st;
int x;
scanf("%d",&x);
st->item = x;
while(scanf("%d",&x) != EOF)
if(x < st->item) //此条件保证每次输入的数据不小于前者
continue;
else
{
List *p = malloc(sizeof(*p));
p->item = x;
st->next = p;
p->next = NULL;
st = p;
}
return head;
}
link LinkRepDel(link st)
{
List *p,*q ,*head;
p = st;
head = p;
q = st->next;
for(;q->next != NULL;)
{
while(p->item == q->item)
q = q->next;
p = p->next;
p->item = q->item;
q = q->next;
}
p->next = NULL;
return head;
}
void show(link st)
{
int N = 0;
do
{
printf("%3d",st->item);
st = st->next;
N++;
} while(st != NULL);
printf("\n");
printf("The size of the link is:%d\n",N);
}