//在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,例如:(7,10,10,21,30,42,42,51,70)将变为(7,10,21,30,42,51,70)
include <stdio.h>
include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *LinkList;
LinkList List_TailInsert(LinkList L)
{
int x; //设元素类型为整型
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *r = L; //r为表尾指针
printf("请输入表元素(以999结尾):");
scanf("%d", &x); //输入结点的值
while (x != 999) //输入999表示结束
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s; //r指向新的表尾结点
scanf("%d", &x);
}
r->next = NULL; //尾结点指针置空
return L;
}
void print(LinkList L)
{
while (L->next != NULL)
{
L = L->next;
printf("%d ", L->data);
}
}
void Del_Same(LinkList L) //L是递增有序的单链表,本算法删除表中数值相同的元素
{
LNode p = L->next, q; //p为扫描工作指针
if (p == NULL)
{
return;
}
while (p->next != NULL)
{
q = p->next; //q指向pr的后继结点
if (p->data == q->data) //找到重复值的结点
{
p->next = q->next; //释放q结点
free(q); //释放相同元素值的结点
}
else
{
p = p->next;
}
}
}
int main()
{
LinkList L, A, B;
LNode *p;
int e, i;
A = (LinkList)malloc(sizeof(LNode));
A = List_TailInsert(L);
printf("尾插法建立的单链表:");
print(A);
printf("\n");
Del_Same(A);
printf("删除相同元素后:");
print(A);
printf("\n");
return 0;
}
//运行结果: