生活永遠是自己的,美哉美哉。就像毛不易唱的二零三,給我想要的自由。
鏈表算告一段落,本篇是單鏈表的學習代碼筆記,本來也想想每一步都做圖,分享知識,讓更多的朋友去學習,但是本人局限于能力,圖片無法表達自己想要的描述,所以干脆不做圖了。
隨后日子會有雙鏈表的操作,后面仍然會分享棧、隊列的自學筆記,也可能寫匯編8086的心得,希望大家一起共勉。
代碼可能有些繁瑣(很多地方都可以優(yōu)化),只是新手 給 新手的一些參考
反轉鏈表用的迭代思路參考(引用):https://blog.csdn.net/blioo/article/details/62050967
作者:blioo
本人感覺引用文章思路非常好,適合初學者,推薦給大家,下面貼自己的學習心得:
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供宜城網(wǎng)站建設、宜城做網(wǎng)站、宜城網(wǎng)站設計、宜城網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、宜城企業(yè)網(wǎng)站模板建站服務,十載宜城做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}Node,*PNode;
PNode ControlLinkList(PNode PHead, int len); //控制函數(shù)
PNode CreateLinkList(void); //構造鏈表
int TraverseLinkList(PNode PHead); //遍歷鏈表,返回鏈表長度len
void GetInfo(PNode PNew, int i); //用戶信息輸入,當輸入代碼量大的時候封裝起來
void InsertLinkList(PNode PHead, int pos, int data, int len); //插入某節(jié)點
void FindLinkList(PNode PHead, int pos); //尋找某節(jié)點
void DeleteLinkList(PNode PHead, int pos); //刪除某節(jié)點
void ModifyLinkList(PNode PHead, int pos, int data); //修改某數(shù)據(jù)
void ExportLinkList(PNode PHead); //導出鏈表(或導出某節(jié)點之前、之后的數(shù)據(jù)稍加修改即可)
PNode ReverseLinkList(PNode PHead); //逆轉鏈表
void ReleaseLinkList(PNode PHead); //釋放鏈表
int main(void)
{
PNode PHead = CreateLinkList();
int len = TraverseLinkList(PHead);
ControlLinkList(PHead,len);
return 0;
}
PNode ControlLinkList(PNode PHead, int len)
{
int pos;
int data = 0;
printf("請輸入插入的節(jié)點pos:\n");
scanf("%d",&pos);
printf("請輸入插入的數(shù)據(jù)data:\n");
scanf("%d",&data);
InsertLinkList(PHead, pos, data, len);
TraverseLinkList(PHead);
printf("請輸入查詢的節(jié)點: ");
scanf("%d",&pos);
FindLinkList(PHead, pos);
printf("請輸入刪除的節(jié)點: ");
scanf("%d",&pos);
DeleteLinkList(PHead, pos);
TraverseLinkList(PHead);
printf("請輸入修改的節(jié)點: ");
scanf("%d",&pos);
printf("請輸入修改的數(shù)據(jù): ");
scanf("%d",&data);
ModifyLinkList(PHead, pos, data);
TraverseLinkList(PHead);
ReverseLinkList(PHead);
TraverseLinkList(PHead);
ReleaseLinkList(PHead);
return PHead;
}
void GetInfo(PNode PNew, int i)
{
printf("請輸入 No.%d Data = ",i+1);
scanf("%d",&PNew->data);
}
PNode CreateLinkList(void)
{
int i;
int len = 0;
PNode PHead = (PNode)malloc(sizeof(Node));
PNode PTail = PHead;
if( NULL == PHead )
{
printf("內存分配失敗\n");
exit(EXIT_FAILURE);
}
PTail->next = NULL;
printf("請輸入節(jié)點個數(shù): ");
scanf("%d",&len);
for( i = 0; i < len; i++ )
{
PNode PNew = (PNode)malloc(sizeof(Node));
if( NULL == PNew )
{
printf("內存分配失敗\n");
exit(EXIT_FAILURE);
}
GetInfo(PNew, i);
PTail->next = PNew;
PNew->next = NULL;
PTail = PNew;
}
printf("共%d個鏈表創(chuàng)建成功\n",i+1);
return PHead;
}
int TraverseLinkList(PNode PHead)
{
int len = 0;
PNode p = PHead->next;
while( NULL != p)
{
len++;
printf("No.%d Data = %d\n",len,p->data);
p = p->next;
}
printf("遍歷完成\n");
return len;
}
void InsertLinkList(PNode PHead, int pos, int data, int len)
{
int i = 0;
PNode p = PHead->next;
if( NULL != p )
{
PNode PNew = (PNode)malloc(sizeof(Node));
if( NULL == PNew )
{
printf("分配內存失敗");
exit(EXIT_FAILURE);
}
// printf("LEN = %d\n",len);
if( 0 != pos-1 )
{
int l = 1; //為了彌補i從0開始
while( l < pos-1 ) //中間插法
{
l++;
p = p->next;
}
PNew->data = data;
PNew->next = p->next;
p->next = PNew;
}
/*
else if( pos > len && 0 != pos-1 ) //插入鏈表尾
{
while( i < len )
{
i++;
p = p->next;
}
p->next = PNew; //最后一個p節(jié)點指向NULL
PNew->data = data;
PNew->next = NULL;
}
*/
else
{
PHead->next = PNew; //插入鏈表頭
PNew->data = data;
PNew->next = p;
}
}
else
{
printf("空鏈表\n");
}
}
void FindLinkList(PNode PHead, int pos)
{
int i = 0;
PNode p = PHead->next;
if( NULL != p )
{
while( i < pos-1 )
{
i++;
p = p->next;
}
printf("查找元素成功,數(shù)據(jù)如下:\n");
printf("No.%d Data = %d\n",i+1,p->data);
}
else
{
printf("鏈表為空\n");
}
}
void DeleteLinkList(PNode PHead, int pos)
{
int i = 0;
PNode p = PHead->next;
PNode PTemp;
while( NULL != p && i != (pos-1) )
{
i++;
p = p->next;
}
PTemp = p->next;
p->next = p->next->next;
free(PTemp);
PTemp = NULL;
printf("刪除節(jié)點成功\n");
}
void ModifyLinkList(PNode PHead, int pos, int data)
{
int i = 0;
PNode p = PHead->next;
while( NULL != p && i != pos-1 ) //一般用這種方式來判空與循環(huán)代碼簡潔
{
i++;
p = p->next;
}
p->data = data;
printf("修改數(shù)據(jù)成功:\n");
printf("No.%d Data = %d\n\n",i,p->data);
}
void ExportLinkList(PNode PHead)
{
FILE *fp;
PNode p = PHead->next;
if( (fp = fopen("LinkList.txt","ab")) == NULL )
{
printf("讀取文件失敗,創(chuàng)建文件成功");
exit(EXIT_FAILURE);
}
while( NULL != p )
{
fputc(p->data,fp);
p = p->next;
}
printf("導出成功");
fclose(fp);
}
PNode ReverseLinkList(PNode PHead)
{
PNode q = NULL; //作為反轉節(jié)點
PNode Ptemp = NULL; //建立新節(jié)點指向下一個
PNode p = PHead->next; //指向第一個鏈表數(shù)據(jù)
PHead->next = NULL; //頭結點為空
while( NULL != p )
{
Ptemp = p->next; //下一個節(jié)點
p->next = q; //指向反轉節(jié)點
q = p; //q指向前一個節(jié)點p q->next = p;
p = Ptemp; //p接著去下一個節(jié)點
}
PHead->next = q; //頭結點指向翻轉后的鏈表
printf("鏈表翻轉成功\n");
return PHead;
}
void ReleaseLinkList(PNode PHead)
{
PNode p = PHead->next;
PNode temp;
PHead->next = NULL;
free(PHead);
while( NULL != p )
{
temp = p->next;
free(p);
p = temp;
}
free(temp);
printf("釋放成功!\n");
}
?代碼在window7 64 VC++6.0編譯通過粘貼,代碼可能縮進有些不好看。下面說一說循環(huán)單鏈表思路,姑且以我的認識和實際的應用,就是就體現(xiàn)在循環(huán)的不同。
1、在創(chuàng)建單鏈表的時候,最后把PNew->next = NULL 改為 PNew->next = PHead;
2、這里PHead是頭結構體指針,所以->next才是指向第一個數(shù)據(jù)。
3、循環(huán)單鏈表,PHead可以從鏈表任意節(jié)點開始遍歷都可以遍歷整個鏈表。
注意:循環(huán)條件不可以是while( NULL !=p ),因為循環(huán)鏈表沒有NULL值,進入死循環(huán)了就。頭尾相連,遍歷條件應該改為 while( PHead != p ),頭不等于p不就解決了。
分享標題:單鏈表(包含反轉、導出、循環(huán)鏈表思路)
轉載注明:http://bm7419.com/article2/jcicic.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、建站公司、ChatGPT、外貿建站、云服務器、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)