【问题描述】用单链表保存m个整数,结点的结构为[data][link],且|data|≦n(n为正整数)。设计一个算法,对于链表中data的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。
【输入形式】
第一行包括一个整数m,第二行为m个整数,以空格分开
【输出形式】
按顺序输出链表中的剩余元素
【样例1输入】
8
-1 2 1 4 6 7 8 4
【样例1输出】
-1 2 4 6 7 8 4
【样例2输入】
4
-5 3 2 -3
【样例2输出】
-5 3 2
#include<stdio.h>
#include<malloc.h>
#include<iostream>
#include<math.h>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList(LinkList &L,int n)
{
L = (LinkList)malloc(sizeof(LNode));//头节点
L->next=NULL;
LinkList p=L;
int i;
for(i=0;i<n;i++)
{
LinkList p1;
p1=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p1->data);
p1->next= p->next;
p->next=p1;
p=p1;
}
//p->next=NULL;
}
void Delete(LinkList &L)
{
LinkList q;
q=L->next;
while(q->next)
{
LinkList p=q;
while(p->next)
{
if(fabs(q->data)==fabs(p->next->data))
{
LinkList s = p->next;
p->next=s->next;
free(s);
}
else
p=p->next;
}
if(q->next==NULL)
break;
else q=q->next;
}
}
int main()
{
LinkList L1;
int n1;
scanf("%d",&n1);
CreateList(L1,n1);
Delete(L1);
LinkList q;
q=L1->next;
while(q)
{
printf("%d ",q->data);
q=q->next;
}
}