一.定義
鏈表是由一系列節點組成,每個結點包含兩個域,一個是數據域,數據域用來保存用戶數據,另一個是指針域,保存下一個節點的地址。鏈表在內存中是非連續的。
二.分類
靜態鏈表 動態鏈表
單向鏈表 雙向鏈表 循環鏈表 單向循環鏈表 雙向循環鏈表
三.鏈表的初始化,插入,遍歷,銷毀
#include<stdio.h>
#include<stdlib.h>typedef struct Linknode
{int data;struct Linknode*next;
}Linknode;
//初始化鏈表,即創建第一個方塊
Linknode* Init_Linknode()
{//創建一個頭指針Linknode* header=(Linknode*)malloc(sizeof(Linknode));header->data=0;header->next=NULL;//設置尾結點Linknode* tail=header;//一開始讓頭指針等于尾指針int value=1;while(1){printf("請輸入數據");scanf("%d",&value);if(value==-1) break;//創建新節點Linknode* new=(Linknode*)malloc(sizeof(Linknode));new->data=value;new->next=NULL;//把新節點插入到鏈表中去tail->next=new;//把新節點變成尾結點tail=new;}return header;
}//遍歷鏈表
void Foreach_Linknode(Linknode* header)
{if(header==NULL) return;//輔助指針變量,指向頭指針的nextLinknode* pCurrent=header->next;while(pCurrent!=NULL){printf("%d\n",pCurrent->data);pCurrent=pCurrent->next;}
}
//插入鏈表
void Insertvalue(Linknode* header,int oldvalue,int newvalue)
{if(header==NULL) return;Linknode* pPrv=header;Linknode* pCurrent=pPrv->next;while(pCurrent!=NULL){if(pCurrent->data==oldvalue){break;}pPrv=pCurrent;pCurrent=pCurrent->next;}//如果pCurrent為空,說明鏈表中不存在oldvalueif(pCurrent==NULL){return;}//先創建新的結點Linknode* newnode=(Linknode*)malloc(sizeof(Linknode));newnode->data=newvalue;newnode->next=NULL;//新節點插入到鏈表中newnode->next=pCurrent;pPrv->next=newnode;
}//清空
void ClearLinknode(Linknode* header)
{if(header==NULL) return;//輔助指針變量Linknode* pCurrent=header->next;while(pCurrent!=NULL){//先保存當下一個節點的地址Linknode* pNext=pCurrent->next;//釋放當前節點的內存free(pCurrent);//指向下一個結點pCurrent=pNext;header->next=NULL;}
}//刪除值為value的結點
void RemoveLinknode(Linknode*node,int value)
{if(node==NULL) return;Linknode* pPrv=node;Linknode* pCurrent=pPrv->next;while (pCurrent!=NULL){if(pCurrent->data==value){break;}//移動輔助指針pPrv=pCurrent;pCurrent=pCurrent->next;}if(pCurrent==NULL){return;}pPrv->next=pCurrent->next;free(pCurrent);pCurrent=NULL;
}
//銷毀
void DestroyLinknode(Linknode* header)
{if(header==NULL){return;}Linknode* pCurrent=header;while(pCurrent!=NULL){Linknode* pNext=pCurrent->next;//釋放當前結點內存free(pCurrent);//結點向后移動pCurrent=pNext;}
}
int main(void)
{Linknode* header=Init_Linknode();Foreach_Linknode(header);Insertvalue(header,300,666);printf("________________________________");Foreach_Linknode(header);return 0;
}