本關需要你設計一個程序,實現單鏈表的逆置。
成都創新互聯公司專注于雨花網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供雨花營銷型網站建設,雨花網站制作、雨花網頁設計、雨花網站官網定制、小程序開發服務,打造雨花網絡公司原創品牌,更為您提供雨花網站排名全網營銷落地服務。單鏈表的逆置分為兩種方法:頭插法和就地逆置法,這兩種方法雖然都能夠達到逆置的效果,但還是有著不小的差別。
頭插法
逆置鏈表初始為空,表中節點從原鏈表中依次“刪除”,再逐個插入逆置鏈表的表頭(即“頭插”到逆置鏈表中),使它成為逆置鏈表的“新”的第一個結點,如此循環,直至原鏈表為空。
就地逆置法
先假定有一個函數,可以將以head
為頭結點的單鏈表逆序,并返回新的頭結點。利用這個函數對問題進行求解:將鏈表分為當前表頭結點和其余部分,遞歸的過程就是,先將表頭結點從鏈表中拆出來,然后對其余部分進行逆序,最后將當前的表頭結點鏈接到逆序鏈表的尾部。遞歸的終止條件就是鏈表只剩一個節點時,直接返回這個節點。
編程要求
按程序提示輸入并創建一個單鏈表,帶有頭結點;
可自定義鏈表的長度,可自定義鏈表儲存的數據類型,注意更改相應的輸入輸出方式;
實現單鏈表的逆置,直觀地輸出結果。
效果如下: 輸入:
6
1 212 7 8 0 2
輸出:
鏈表逆置前的數據:
1 212 7 8 0 2
鏈表逆置后的數據:
2 0 8 7 212 1
#include#include#includetypedef struct node {
int data;
struct node *next;
}NODE,* PNODE;
//函數聲明
PNODE CreateList();
PNODE ReverseList(PNODE phead);
//CreateList函數創建鏈表
PNODE CreateList(){//先用尾插法創建一個鏈表
//創建一個頭節點
PNODE phead=(PNODE)malloc(sizeof(NODE));
phead->next=NULL;
int len=0,i,val;
PNODE p=phead;//p指向頭指針phead
scanf("%d",&len);//輸入的鏈表長度len
for(i=0;inext = pNew;
pNew->data = val;
p=pNew;
}
p->next=NULL;
return phead;
}
//將單鏈表逆置的ReverseList函數
PNODE ReverseList(PNODE phead){
PNODE pHEAD=(PNODE)malloc(sizeof(NODE));//新建一個頭節點pHEAD,然后依次讀入phead中的每一個數據,并用頭插法創建一個以pHEAD為頭指針的新鏈表
pHEAD->next=NULL;
PNODE p = pHEAD->next;
int val;
PNODE q=phead->next;//p指向頭指針phead
while(q!=NULL){
val = q->data;
q= q->next;
PNODE pNew=(PNODE)malloc(sizeof(NODE));//動態分配一個新節點pNew
pHEAD->next = pNew;
pNew->data = val;
pNew->next = p;
p=pNew;
}
//p=pHead;
return pHEAD;
}
void ShowList(PNODE phead){//遍歷鏈表
PNODE p = phead->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return;
}
int main(void)
{
PNODE phead;
phead = CreateList();
printf("鏈表逆置前的數據:\n");
ShowList(phead);
phead = ReverseList(phead);
printf("鏈表逆置后的數據:\n");
ShowList(phead);
return 0;
}
第2關:統計單鏈表中的節點數本小節需要你統計單鏈表中的節點數。
相關知識
根據上一關我們知道怎么創建單鏈表了,那么這一關讓我們鞏固一下單鏈表的知識。
編程要求
請仔細閱讀右側代碼,根據方法內的提示,在Begin - End
區域內進行代碼補充,具體任務如下:
編寫程序,從鍵盤輸入一串整數以及整數的個數,以單鏈表形式存儲起來,計算單鏈表中結點的個數,輸出單鏈表的數據及結點的個數。
效果如下:
輸入:
8
12367802
輸出:
12367802
8
#include#include#includetypedef struct node {
int data;
struct node *next;
}NODE,*PNODE;
int length_list(PNODE phead){
int cnt=0;
PNODE p = phead;
while(p->next!=NULL){
cnt++;
p=p->next;
}
return cnt;
}
PNODE CreatList(){
//創建頭節點
PNODE phead = (PNODE)malloc(sizeof(NODE));
phead->next = NULL;
int i,len;
scanf("%d",&len);
PNODE p = phead;
for(i=0;idata);
p->next = pNew;
pNew->next = NULL;
p=pNew;
}
return phead;
}
void ShowList(PNODE phead){
PNODE p = phead->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return;
}
int main(void)
{
PNODE phead;
phead = CreatList();
ShowList(phead);
printf("%d", length_list(phead));
return 0;
}
第1關:建單向鏈表本關需要你建立一個帶頭結點的單向鏈表。
相關知識
什么是鏈表?鏈表和二叉樹是C
語言數據結構的基礎和核心。
鏈表有多種形式,它可以是單鏈接的或者雙鏈接的,可以是已排序的或未排序的,可以是循環的或非循環的。
編程要求
請仔細閱讀右側代碼,根據方法內的提示,在Begin - End
區域內進行代碼補充,具體任務如下:
鍵盤輸入一組元素,建立一個帶頭結點的單向鏈表(無序)。
要求:
輸入整數的長度以及整數;
輸出無序的單向鏈表。
效果如下:
輸入:
5
1 23 4 8 9
輸出:
1 23 4 8 9
#include#includetypedef struct node {
int data;
struct node *next;
}NODE,* PNODE;
PNODE CreateList(){
//創建一個頭節點
PNODE phead=(PNODE)malloc(sizeof(NODE));
phead->next=NULL;
int len=0,i,val;
PNODE p=phead;//p指向頭指針phead
scanf("%d",&len);//輸入的鏈表長度len
for(i=0;inext = pNew;
pNew->data = val;
pNew->next = NULL;
p=pNew;
}
//p=pHead;
return phead;
}
void ShowList(PNODE phead){//遍歷鏈表
PNODE p = phead->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
return;
}
int main(void)
{
PNODE phead;
phead = CreateList();
ShowList(phead);
return 0;
}
如果文章對你有用的話,可不可以點一個贊鼓勵我呢^o^
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
網頁名稱:C語言之鏈表練習題-創新互聯
轉載源于:http://vcdvsql.cn/article20/dsoeco.html
成都網站建設公司_創新互聯,為您提供企業網站制作、云服務器、定制開發、App開發、品牌網站設計、Google
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯