设一带头结点的单链表,设计算法将表中值相同的元素仅保留一个结点。
提示:指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;
指针p继续指向下一个元素,开始下一轮的删除,直至p==null为至,既完成了对整个链表元素的删除相同值。
#include<stdio.h>
#define ERROR 0;
#define OK 1
typedef int ElemType; // 定义表元素的类型
typedef struct LNode
{ //线性表的单链表存储
ElemType data;
struct LNode* prior;
struct LNode* next;
}LNode, * LinkList;
LinkList CreateList(int n) //返回值类型是指向该结点的指针
{
LNode * p, * q, * head; //定义三个结点型指针
int i;
head = (LinkList)malloc(sizeof(LNode));
head->next = NULL;
p = head;
for (i = 0; i < n; i++)
{
q = (LinkList)malloc(sizeof(LNode));
printf("input data %i:", i + 1);
scanf_s("%d", &(q->data)); //输入元素值
q->next = NULL; //结点指针域置空
p->next = q; //新结点连在表末尾
q->prior = p;
p = q; //让p指针每次都指向尾结点
}
return head;
}
//输出带头结点单链表的所有元素
void PrintList(LinkList L)
{
LNode* p;
p = L->next; //p指向单链表的第1个元素
while (p != NULL)
{
printf("%5d", p->data);
p = p->next;
}
}
//删除相同的元素
void delete(LinkList L)
{
LNode* p, * q;
p = L->next;//p指向首元结点(第一个元素)
q = p->next;
while(p!=NULL)
{
while (q != NULL)
{
if (q->data == p->data)
{
q->next->prior = q->prior;
q->prior->next = q->next;
free(q);
}
q = q->next;
}
p = p->next;
}
}
int main()
{
int n;
printf("请输入链表总元素个数:");
scanf_s("%d",&n);
LinkList L=NULL;
L=CreateList(n);
PrintList(L);
delete(L);
}