1.知識百科
??鏈表(Linked List)是計算機科學中一種基礎的數據結構,通過節點(Node)的鏈式連接來存儲數據。每個節點包含兩部分:存儲數據的元素和指向下一個節點的指針(單鏈表)或前后兩個指針(雙鏈表)。
- 常見操作
??插入:在頭部、尾部或指定位置插入節點。
??刪除:刪除指定節點(需處理指針指向)。
??遍歷:從頭節點依次訪問每個節點。
??查找:按值或位置查找節點(需遍歷)。
2.鏈表操作
2.1 創建鏈表
??創建一個鏈表,用于保存學生信息,分別存儲姓名、學號和成績。
typedef struct STU{char name[50];char id[20];float score;struct STU *next;
}STU_INFO,*P_STU;
??添加節點,每一個節點保存一位學生信息。
/*錄入信息*/
void STU_Input(P_STU node)
{printf("請輸入姓名、學號、成績:\n");scanf("%s%s%f",node->name,node->id,&node->score);while(getchar()!='\n');
}
/*
添加節點(尾插法)
*/
void STU_AddNode(P_STU *head)
{if(*head==NULL){*head=malloc(sizeof(STU_INFO));//創建鏈表頭(*head)->next=NULL;STU_Input(*head);//錄入成員信息return ;}//鏈表頭已存在P_STU phead=*head;//偏移指針,將phead指向鏈表尾while(phead->next!=NULL){phead=phead->next;}//創建節點P_STU new_node=malloc(sizeof(STU_INFO));printf("添加節點:%p\n",new_node);phead->next=new_node;phead=phead->next;phead->next=NULL;//new_node->next=NULL;//錄入信息STU_Input(new_node);//錄入成員信息
}
2.2 遍歷鏈表
??遍歷鏈表,查看所有學生信息。
void STU_Output(P_STU head)
{P_STU phead=head;//指向鏈表頭while(phead!=NULL){printf("姓名:%s 學號:%s 成績:%.1f\n",phead->name,phead->id,phead->score);phead=phead->next;}
}
2.3 刪除節點
??根據名字查找子節點,并刪除。
??當刪除的節點為中間節點,刪除過程如下:
??當刪除的節點為頭節點,刪除過程如下:
??節點刪除代碼實現如下,支持刪除多個連續的重復節點。
//查找子節點進行刪除
P_STU STU_FindNode_Del(P_STU head)
{//判斷鏈表頭是否為NULLP_STU phead=head;P_STU temp=head,temp2;char name[50];printf("請輸入要查找的名字:\n");scanf("%s",name);while(getchar()!='\n');while(phead!=NULL){if(strcmp(phead->name,name)==0){//要刪除的數據在鏈表頭if(phead==head){temp=phead;phead=phead->next;free(temp);head=phead;}else{//要刪除的數據不在鏈表頭temp->next=phead->next;temp2=phead;phead=phead->next;free(temp2);//釋放節點}}else //繼續找下一個成員{temp=phead;phead=phead->next;//繼續查找下一個成員}}return head;//返回鏈表頭
}
??測試示例:
int main()
{P_STU head=NULL;//定義一個結構體指針int i=0;//添加節點while(1){STU_AddNode(&head);i++;if(i>=4)break;}printf("遍歷鏈表\n");STU_Output(head);printf("刪除節點\n");head=STU_FindNode_Del(head);printf("剩余成員信息\n");STU_Output(head);return 0;
}
??運行效果:
wbyq@wbyq-virtual-machine $ ./a.out
請輸入姓名、學號、成績:
1 1 1
請輸入姓名、學號、成績:
2 2 2
請輸入姓名、學號、成績:
2 2 2
請輸入姓名、學號、成績:
3 3 3
遍歷鏈表
姓名:1 學號:1 成績:1.0
姓名:2 學號:2 成績:2.0
姓名:2 學號:2 成績:2.0
姓名:3 學號:3 成績:3.0
刪除節點
請輸入要查找的名字:
2
剩余成員信息
姓名:1 學號:1 成績:1.0
姓名:3 學號:3 成績:3.0