算法思想:通过冒泡排序将无序单链表变成有序单链表,然后访问有序单链表中的每一对前驱和后继,若后继结点中的数据与前驱结点中的数据相同,则将后继结点删除;重复上述步骤,直到访问完链表中的每一对前驱和后继结点。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LinkNode {
ElemType data;
LinkNode* next;
}LinkNode, * LinkList;
//尾插法建立单链表
void creatLinkList(LinkList& L) {
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
LinkNode* pTail = L;
int num;
while (scanf("%d", &num) && num != -1) {
LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
pnode->data = num;
pnode->next = pTail->next;
pTail->next = pnode;
pTail = pnode;
}
}
//打印输出
void printLinkList(LinkList L) {
LinkNode* pCur = L->next;
while (pCur != NULL) {
printf("%d ", pCur->data);
pCur = pCur->next;
}
}
//冒泡排序+访问每一对前驱和后继进行删除
void bubble(LinkList& L) {
while (1) {
int flag = 0;
LinkNode* preCur = L;
LinkNode* pCur = L->next;
while (pCur->next != NULL) {
preCur = pCur;
pCur = pCur->next;
if (preCur->data > pCur->data) {
ElemType temp = preCur->data;
preCur->data = pCur->data;
pCur->data = temp;
flag = 1;
}
}
if (flag == 0) {
break;
}
}
}
void delectSameNum(LinkList& L) {
LinkNode* preCur = L;
LinkNode* pCur = L->next;
while (pCur!= NULL) {
if (preCur->data == pCur->data) {
LinkNode* pnode = pCur;
pCur = pCur->next;
preCur->next = pCur;
free(pnode);
}
else {
preCur = pCur;
pCur = pCur->next;
}
}
}
int main() {
LinkList L;
creatLinkList(L);
bubble(L);
delectSameNum(L);
printLinkList(L);
return 0;
}