链表中|[data]|<=n
例如:2,15,-15,2,3,6,3
只保留:2,15,3,6;
整体思想:设置一个辅助空间数组,大小为n+1,全赋初值为零;依次循环遍历链表,链表的绝对值所对应的数组元素第一次出现为零,将其修改为1,以后遍历到则删除对应的链表元素。
代码段:
void Func(LinkList L, int n)
{
LinkList p = L;
int *q; //定义一个辅助数组
q = (int*)malloc(sizeof(int) * (n + 1)); //给数组分配n+1个大小的空间
int m;
for (int i = 0; i < n + 1; i++) //q数组所有元素赋值为零
{
q[i] = 0;
}
while (p->next != NULL)
{
m = p->next->data > 0 ? p->next->data : -p->next->data; //取绝对值
if (q[m] == 0) //第一次出现,修改元素的值为1
{
q[m]= 1;
p = p->next; //依次遍历
}
else //重复出现,则删除
{
L = p->next;
p->next = L->next;
free(L);
}
}
free(q); //释放数组q的空间
}
总体测试代码:
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
typedef struct LNode
{
int data;
struct LNode* next;
}LNode, * LinkList;
LinkList List_H(LinkList& L) //头插法插入元素
{
LNode* s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("请输入链表元素的值(输入-1结束)\n:");
scanf_s("%d", &x);
while (x != -1)
{
s = (LNode*)malloc(sizeof(LNode));
s->next = NULL;
s->data = x;
s->next = L->next;
L->next = s;
scanf_s("%d", &x);
}
return L;
}
LinkList PrintfList(LinkList L) //打印元素
{
LNode* p;
p = L->next; //p指向第1号元素
if (p == NULL)
printf("NULL");
else
printf("打印链表中的元素:");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
return L;
}
void Func(LinkList L, int n)
{
LinkList p = L;
int *q; //定义一个辅助数组
q = (int*)malloc(sizeof(int) * (n + 1)); //给数组分配n+1个大小的空间
int m;
for (int i = 0; i < n + 1; i++) //q数组所有元素赋值为零
{
q[i] = 0;
}
while (p->next != NULL)
{
m = p->next->data > 0 ? p->next->data : -p->next->data; //取绝对值
if (q[m] == 0) //第一次出现,修改元素的值为1
{
q[m]= 1;
p = p->next; //依次遍历
}
else //重复出现,则删除
{
L = p->next;
p->next = L->next;
free(L);
}
}
free(q); //释放数组q的空间
}
int main()
{
int x = 0;
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
List_H(L);
PrintfList(L);
Func(L, 100);
PrintfList(L);
return 0;
}