演算法思想:
1、創建一個單鏈表并輸入資料
2、雙重遍歷鏈表
- 判斷鏈表是否為空,若為空,則回傳(在36行已經行進行判斷)
- 如果第一層遍歷時,有值與之相同,則洗掉該值并釋放空間,再繼續遍歷
- s的作用:作為一個前驅,主要是前驅是為了確保在洗掉最后一個結點的時候,前一個結點指向的是空值(體現在43行)
3、列印輸出最后的鏈表
具體代碼
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;//定義資料型別為int型別
typedef struct LNode{//定義結構體
Elemtype data;
struct LNode *next;
}LNode,*Linklist;
void Init_Linklist(Linklist *L)//初始化鏈表
{
*L=(Linklist)malloc(sizeof(LNode));//定義頭結點
(*L)->next=NULL;//置結束標記NULL
}
void Create_Linklist(Linklist *L, int LEN)//創建鏈表(有頭結點)
{
LNode *p,*q;
p = *L;//p指向頭結點
printf("請輸入單鏈表:\n");
for(int i=0;i<LEN;i++)
{
q=(Linklist)malloc(sizeof(LNode));//定義q結點
scanf("%d",&q->data);
p->next=q;
p=q;//p挪向下一個結點q(回圈輸入data值)
}
p->next=NULL;
}
void DeleteSame(Linklist *L)//洗掉值相同的結點
{
LNode *p,*q,*s;
p = (*L)->next;//此時p為鏈表的第一個元素
for(p;p!=NULL;p=p->next)//p遍歷整個鏈表,當p不等于空時,p指向它的下一個結點
{
s=p; //s指向要洗掉結點的前驅
for(q=p->next;q!=NULL; )
{
if(q->data==p->data)//當q的值與p的值相同時
{
s->next=q->next;//q指向原來q的下一個結點
free(q);//釋放q的記憶體空間
q=s->next;
}
else
{
s=q;//s指向下一個結點q
q=q->next;//q指向q的下一個結點
}
}
}
}
void Print_Linklist(Linklist *L)//列印鏈表的值
{
LNode *p;
p = *L;
while(p->next)//當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站小視頻
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/404222.html
標籤:其他
