用链表实现的一个小程序(C语言)

这个程序是实现这样一个功能:输入一列整数,输出是把这列数重复出现的数字过滤掉。

例如:输入12 13 12 14 13,输出:12 13 14,用链表实现。

//[email protected]

#include <stdio.h>
#include <stdlib.h>

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<n;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;
}


 

 

你可能感兴趣的:(c,list,struct,null,Build,语言)