这个程序是实现这样一个功能:输入一列整数,输出是把这列数重复出现的数字过滤掉。
例如:输入12 13 12 14 13,输出:12 13 14,用链表实现。
//liushuaikobe1993@163.com
#include
#include
typedef struct NODE //节点的结构体类型
{
int e;
struct NODE *next;
}node,*linklist;
int get_element() //获取节点的数据段数据
{
int i;
scanf("%d",&i);
return i;
}
linklist build_list(int n)//链表的建立,其中n是链表的长度
{
linklist p,r,head=NULL;
int i;
printf("请一次性输入数字:");
for (i=0;i
{
p=(linklist)malloc(sizeof(node));
p->e=get_element();
p->next=NULL;
if (!head)//head为空,本次建立的是第一个节点,将它赋给head
head=p;
else//head不为空,本次建立的不是第一个节点,将它接在链表的尾部
r->next=p;
r=p;//r永远指向链表最后一个节点
}
return head;
}
void del_same_element(linklist head)
{
linklist r,p,t;
for (r=head;r!=NULL;r=r->next)
for (p=r->next;p!=NULL;p=p->next)
if (r->e==p->e)
{
for (t=head;t->next!=NULL;t=t->next)
if (t->next==p)
{
t->next=p->next;
break;
}
}
}
void display_list(linklist head)
{
linklist r;
for (r=head;r/*->next*/!=NULL;r=r->next)//如果"->next"不被注释掉,那么这也是错误的,链表的最后一个元素无法被遍历
printf("%d ",r->e);
/*linklist r=head; //这段代码是错误的,这样遍历链表会导致链表最后一个节点无法遍历的到,请读者自己分析
while(r!=NULL)
{
printf("%d ",r->e);
r=r->next;
}*/
}
int main()
{
int num;
while(1)
{
printf("输入元素个数(至少两个):");
scanf("%d",&num);
if (num>=2)
break;
}
linklist head=build_list(num);
del_same_element(head);
display_list(head);
return 0;
}