定義存儲結構(以單向鏈表為主)
對于鏈表的定義,通過結構體進行定義,包括兩部分,一是數據域,另一個就是指針,用于指向下一個節點。
1,創建鏈表
定義鏈表:
struct nodesq{int data;//數據域,這里以int為例struct nodesq * netx;//指向自身類型的指針域
}
創建鏈表:棧式(往前/左走)、隊列式(往后/右走)
一般創建鏈表是通過循環創建的,這里為了方便理解才這樣創建的。
struct nodesq *p1,*p2,*p3;
p1 = new nodesq;
p1->date = a1;
p2 = new nodesq;
p2->date = a2;
//p2->next = p1;//棧式,即后來的當head
p1->next = p2;//隊列式
如圖所示:
2,鏈表的查詢(按序號、按數據元素)
例如:找數據域為a3的節點(按數據元素查找)
首先,有頭有尾成鏈才是鏈表;鏈表的查詢是建立在已創建鏈表的基礎上。
只需要查找p->data是不是a3即可,若不是,接著查找下一個,p=p->next;
head = p;//首先,將給定的head頭指針賦值給指針p
while(p->data != a3){//若當前節點的數據域不是a3p = p->next;//進行下一個節點判斷
}
例如:找序號為4的節點(按序號查找)
也就是查詢4次即可。
首先,有頭有尾成鏈才是鏈表;鏈表的查詢是建立在已創建鏈表的基礎上。
這里只需要定義一個變量wsq用于存儲序號即可,通過自加操作,到達4,則停下即可。
head = p;//首先,將給定的head頭指針賦值給指針p
int wsq=0;
while(wsq != 4){//若當前節點的數據域不是a3p = p->next;//進行下一個節點判斷wsq++;//序號自加
}
3,鏈表的插入
例如:在a3之前插入數據域為a2‘的節點S
首先,有頭有尾成鏈才是鏈表;鏈表的查詢是建立在已創建鏈表的基礎上。
在a3之前插入a2’,這里關鍵點在于:①找到a3前的一個節點a2,將新插入的a2‘數據域對應的節點S的next指向a3節點。②a2所在的節點的next指向a2’所在的節點S。
head = p;//首先,將給定的head頭指針賦值給指針p
while(p->next->data != a3){//找a3前一個節點p = n->next;//沒找到,指針找下一個節點
}//當結束循環之后,p指向a3上一個節點位置
S->next = p->next;//p->next此時為a3所在節點,賦值給S節點的next,即S節點的next指向a3所在節點,此時a2所在節點和S節點的next都指向a3所在的節點
p->next = S;//將a2所在的節點原本指向a3所在節點,給改成指向S節點
最終實現效果圖如下:
4,鏈表的刪除
例如:刪除a3所在的節點
首先,有頭有尾成鏈才是鏈表;鏈表的查詢是建立在已創建鏈表的基礎上。
刪除a3所在的節點,需要找到a3所在的節點之前的一個節點,即a2所在的節點。然后,將a2所在的節點的next指向a3所在節點的下一個節點。
head = p;//首先,將給定的head頭指針賦值給指針p
while(p->next->data != a3){//找a3前一個節點p = n->next;//沒找到,指針找下一個節點
}//當結束循環之后,p指向a3上一個節點位置,即a2所在的節點
p->next = p->next->next;//p->next->next即a3所在節點的下一個節點,也就是a4所在的節點位置 賦值給 p->next也就是a2所在的節點的next
之后a3需要進行回收一下即可
最后的效果圖如下:
5,鏈表的輸出
p = head;
while(p != NULL){//全部挨個輸出printf("%d",p->data);p = p->next;//找下一個節點
}
while(p->next != NULL){//最后一個節點不輸出printf("%d",p->data);p = p->next;//找下一個節點
}