#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next;
}LNode,*LinkList;
void InputList(LinkList L);//输出
LinkList CreatList(int n)//创建链表 头插法
{
LinkList p,L;
int data,i;//用于输入数据
L = (LinkList)malloc(sizeof(LNode));//头节点
L->next = NULL;
printf("请输入数据:\n");
for(i = n;i > 0;--i)
{
p = (LinkList)malloc(sizeof(LNode));//生成新节点
scanf("%d",&p->data);
p -> next = L -> next;
L-> next = p;
}
return L;
}
void DeleoneList(LinkList L)//删除方法一 :遍历原链表,建立新链表,如果有相同,则不加入,如果没有,则加入
{
printf("第一种删除方法:\n");
LinkList head,p,q,r,m;//建立新链表
head = (LinkList)malloc(sizeof(LNode));//新链表头节点
head ->next = NULL;
q = head;
p = L->next;
int flag = 0;
// InputList(q);//输出结果
while(p!=NULL)
{
for(m = head->next;m!=NULL;m=m->next)
{
if(p->data==m->data)
{
flag = 1;
break;
}
}
if(flag==0)//可以插入新数据
{
r = (LinkList)malloc(sizeof(LNode));
r->data = p->data;
r->next = q->next;
q->next = r;
}
// InputList(q);//输出结果
flag = 0;
p = p->next;//下一个数据
}
printf("结果如下:");
InputList(q);//输出结果
}
void DeletwoList(LinkList L)//删除方法二:进行双重循环遍历,外循环当前遍历的结点为cur,内循环从cur开始遍历,相同则删除
{
printf("第二种删除方法:\n");
LinkList p,q,r,m;
p = L->next;
while(p!=NULL)
{
q = p;
while(q->next!=NULL)
{
if(p->data==q->next->data)//删除q这个节点
{
q->next = q->next->next;//删除q->next这个节点
}
else
{
q = q->next;
}
}
p = p->next;
}
printf("结果如下:");
InputList(L);//输出结果
}
void sort(LinkList L) //排序
{
LinkList p,q;
int temp;
for(p=L->next;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->data>q->data)
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
}
void DelethreeList(LinkList L)//先排序,和前一个元素比较,相同就下一个,不同就直接删除
{
printf("第三种删除方法:\n") ;
sort(L);
LinkList p,q;
p = L->next;
while(p->next!=NULL)
{
if(p->data==p->next->data)
{
p -> next = p->next->next;
}
else
{
p = p->next;
}
}
printf("结果如下:");
InputList(L);//输出结果
}
void InputList(LinkList L)//输出链表
{
LinkList p;
p = L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
int n;
printf("请输入节点个数:\n");
scanf("%d",&n);
LinkList L = CreatList(n);//创建链表
DeleoneList(L);//第一种删除方法
// DeletwoList(L);//第二种删除方法
// DelethreeList(L);//第三种删除方法
return 0;
}