算法思想:
1、创建一个单链表并输入数据
2、双重遍历链表
- 判断链表是否为空,若为空,则返回(在36行已经行进行判断)
- 如果第一层遍历时,有值与之相同,则删除该值并释放空间,再继续遍历
- s的作用:作为一个前驱,主要是前驱是为了确保在删除最后一个结点的时候,前一个结点指向的是空值(体现在43行)
3、打印输出最后的链表
具体代码
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode,*Linklist;
void Init_Linklist(Linklist *L)
{
*L=(Linklist)malloc(sizeof(LNode));
(*L)->next=NULL;
}
void Create_Linklist(Linklist *L, int LEN)
{
LNode *p,*q;
p = *L;
printf("请输入单链表:\n");
for(int i=0;i<LEN;i++)
{
q=(Linklist)malloc(sizeof(LNode));
scanf("%d",&q->data);
p->next=q;
p=q;
}
p->next=NULL;
}
void DeleteSame(Linklist *L)
{
LNode *p,*q,*s;
p = (*L)->next;
for(p;p!=NULL;p=p->next)
{
s=p;
for(q=p->next;q!=NULL; )
{
if(q->data==p->data)
{
s->next=q->next;
free(q);
q=s->next;
}
else
{
s=q;
q=q->next;
}
}
}
}
void Print_Linklist(Linklist *L)
{
LNode *p;
p = *L;
while(p->next)
{
p=p->next;
printf("%d ",p->data);
}
printf("\n");
}
int main()
{
int LEN;
printf("请输入单链表的长度:\n");
scanf("%d", &LEN);
Linklist L;
Init_Linklist(&L);
Create_Linklist(&L,LEN);
printf("原始链表为:\n");
Print_Linklist(&L);
DeleteSame(&L);
printf("删除后链表为:\n");
Print_Linklist(&L);
return 0;
}
最后运行结果
讲解视频【粗糙风格】
B站小视频