① c語言中,頭指針,表頭指針,頭結點,第一結點分別是什麼舉個例子,謝謝。
頭指針是以確定線性表中第一個元素對應的存儲位置,一般用於處理數組,鏈表,隊列等數據結構。單鏈表可以用頭指針的名字來命名。單鏈表中頭指針指向頭節點。頭指針指向上述數據結構的起始數據的指針,如指向數組首地址的指針,指向鏈表表頭節點的指針。
頭指針也就是表頭指針
在單鏈表的第一個結點之前附設一個結點(是個結構體),稱之為頭結點。頭結點的數據域可以不存儲任何信息,頭結點的指針域存儲指向第一個結點的指針(即第一個元素結點的存儲位置)。頭結點的作用是使所有鏈表(包括空表)的頭指針非空,並使對單鏈表的插入、刪除操作不需要區分是否為空表或是否在第一個位置進行,從而與其他位置的插入、刪除操作一致。
第一節點,不太清楚,應該是鏈表有效數據存儲的第一個節點吧,就是去除了頭結點的第一個節點。
② C語言頭插法建立單鏈表
1. 所謂頭指針即為指向鏈表第一個節點的指針(若鏈表含有頭結點,則指向頭結點),該指針變數的值即為鏈表第一個節點(或頭節點)的地址 ,故對於你這段代碼來說頭指針L存放的是鏈表第一個元素的地址(因為沒有頭節點),若要將s所指向的元素要插入到表頭,步驟如下:(1)新元素與鏈表建立連接,(2)斷開頭指針與鏈表的連接,(3)頭指針指向新的表頭(本程序中即s所指的元素).
用代碼實現即為:(1)s->next=L(L原先指向第一個元素,現在讓新元素與鏈表建立連接,新元素成為表頭元素,原來的表頭元素成為鏈表上的第二個元素,需要將s的鏈接指針指向原先的表頭元素,即把L中原先存儲的表頭元素的地址賦給s的next指針),(2)(3)L=s(第一步完成了新元素加入鏈表的操作,若要想新元素作為鏈表的第一個元素,就要把它的地址賦給頭指針L,因為L作為頭指針應該始終指向表頭元素.這個語句就是實現第二和第三步的:斷開頭指針與鏈表的連接,頭指針指向新的表頭)
2. 如果你對上面的解釋能接受的話,那麼這一問你應該可以解答了:分析過程就不寫了,由頭至尾為:5->4->3->2->1
3. 至於這一問,要放到具體的上下文環境中來解釋,但無非就是鏈表的插入,刪除操作.可以找相關的資料看一看
誠如一樓所言:這部分剛開始學習時最好畫個圖,就很容易明白了
你也可以去這看一看:
http://blog.csdn.net/bingwen0210/archive/2007/04/07/1556089.aspx
上面有圖.
③ C語言建立帶頭結點的單鏈表
單鏈表的生成有2種方式:頭插法和尾插法。
1、頭插法
/*********************************************************************
*函數名稱:linklist*CreateLinklistHead()
*函數功能:利用頭插法創建鏈表
*參數:無
*返回值:創建完鏈表後的鏈表頭結點
*說明:無
*********************************************************************/
externlinklist*CreateLinklistHead()
{
intx,i,nodeNum;
linklist*head,*temp;//頭結點與臨時結點
head=(linklist*)malloc(sizeof(linklist));//生成表頭結點
head->next=NULL;//給表頭結點的指針域賦值
printf("請輸入鏈表中結點的個數:");
scanf("%d",&nodeNum);
for(i=1;i<=nodeNum;i++)
{
printf("請輸入第%d個結點的數據:",i);
scanf("%d",&x);
temp=(linklist*)malloc(sizeof(linklist));//生成新的結點
temp->data=x;//對新結點的數據域賦值
//將新結點插到頭結點之後
temp->next=head->next;
head->next=temp;
}
returnhead;//返回新建鏈表的頭結點
}
2、尾插法
/*********************************************************************
*函數名稱:linklist*CreateLinklistRear()
*函數功能:利用尾插法創建鏈表
*參數:無
*返回值:創建完鏈表後的鏈表頭結點
*說明:無
*********************************************************************/
externlinklist*CreateLinklistRear()
{
intx,i,nodeNum;
linklist*head,*rear,*temp;//定義頭結點、尾結點和臨時結點
head=(linklist*)malloc(sizeof(linklist));//生成表頭結點,表頭結點不存放數據
head->next=NULL;//將表頭結點的指針域賦值為NULL
rear=head;//將表頭結點賦值給表尾結點
printf("請輸入鏈表中結點的個數:");
scanf("%d",&nodeNum);
for(i=1;i<=nodeNum;i++)
{
printf("請輸入第%d個結點的數據:",i);
scanf("%d",&x);
temp=(linklist*)malloc(sizeof(linklist));//生成新的結點
temp->data=x;//新增結點的數據域
temp->next=NULL;//新增結點的指針域(由於是尾插法,所以插入的結點都在尾部,即指針域為NULL)
rear->next=temp;//使前一個結點指向新增結點(head->next=temp)
rear=temp;//將新增結點賦值給尾結點(尾插法,插入的結點在尾部)(rear=head->next)
}
//rear->next=NULL;//將尾結點的指針域賦值為空(為了方便檢驗鏈表是否為空鏈表)
returnhead;//返回頭結點
}
④ c語言中的單鏈表的表頭,頭結點,第一個節點,表尾,尾節點,最後一個節點有什麼不同與聯系
表頭 頭結點 第一個節點 表尾 尾節點
帶頭鏈表: 頭結點 頭結點 第一個節點 最後一個節點 最後一個
不帶頭鏈表: 第一個 第一個 第一個 最後一個 最後一個
⑤ c語言數據結構單鏈表(頭插入法)
head=(LNode
*)malloc(sizeof(LNode));
這一句不要,沒啥用處,除非你head指向的節點也就是第一個節點的data不需要數據
head->next=NULL;這里修改為head=NULL;
讓head先指向NULL,也就是沒有節點
其實這個可以不要,再主函數中,先讓鏈表是空鏈表即可(即讓head=NULL)
head->data=data;
head->next=p->next;
head->next=p;
關鍵在這里
你仔細考慮一下,一般來說頭插法的head只是一個指針,不要對head指向的那個節點操作,對p操作完成後,讓head指過去即可
所以修改為
p->data=data;
//賦值過去,因為你現在申請了p的內存空間
p->next=head;
//把head指向的那個節點連接到p的後面,這樣完成頭插
//
這是head沒有用了,p成為鏈表的頭指針
head=p;
//head再指向這個鏈表的頭部,也就是p指向的節點,為下一次循環做准備
head=Createlist(head);//鏈表初始化
主函數中這樣不太好,建議不要重名
⑥ C語言中的單鏈表,表頭,首元結點有什麼區別
按照字面意思理解:表頭:單鏈表的頭,一般不存放元素,而存放其他信息例如鏈表長度等。
首元節點:第一個元素的節點。如果有的單鏈表沒有存放其他信息的表頭,那麼首元節點就是表頭,否則首元節點是表頭之後第一個節點。