|
每敲一次代碼都會(huì)有新的收獲,基本功不扎實(shí)啥也干不了。單向鏈表的插入,刪除,創(chuàng)建,遍歷是數(shù)據(jù)結(jié)構(gòu)的基本操作。里邊的算法值得學(xué)習(xí)。
源碼:
/*
先創(chuàng)建一個(gè)單向鏈表,然后從頭結(jié)點(diǎn)開(kāi)始逐個(gè)刪除。
*/
#include"stdio.h"
#include"stdlib.h"
//聲明一個(gè)結(jié)點(diǎn),實(shí)際上就是定義一個(gè)數(shù)據(jù)結(jié)構(gòu)
struct node{
int num;
node *next;
};
//創(chuàng)建鏈表
node *creatlist()
{
int i=0;//統(tǒng)計(jì)創(chuàng)建結(jié)點(diǎn)個(gè)數(shù)
node *head,*p2,*p1;//p2用來(lái)傳遞結(jié)點(diǎn)指針
head=p2=p1=new node;
printf("請(qǐng)輸入頭結(jié)點(diǎn)數(shù)據(jù)域數(shù)據(jù):\n\r");
scanf("%d",&p1->num);
p1->next=NULL;
while(p1->num!=0)
{
p1=new node;
scanf("%d",&p1->num);
p2->next=p1;//頭結(jié)點(diǎn)指針指向新創(chuàng)建的結(jié)點(diǎn)
p2=p1;
i++;
}
p2->next=NULL;//鏈表尾結(jié)點(diǎn)
printf("創(chuàng)建的結(jié)點(diǎn)數(shù)是:%d\n",i);
return head;
}
void display(node *head)
{
node *p=head;
while(p->next!=NULL)
{
printf("%d\t",p->num);
p=p->next;
}
printf("\n");
}
//從頭結(jié)點(diǎn)開(kāi)始刪除整個(gè)鏈表
void remove(node *head)
{
int i=0;//統(tǒng)計(jì)刪除結(jié)點(diǎn)個(gè)數(shù)
//通過(guò)這兩個(gè)指針的移動(dòng)實(shí)現(xiàn)整個(gè)鏈表結(jié)點(diǎn)逐個(gè)刪除,
node *p,*p1;//也就是說(shuō)本函數(shù)只需輪流使用這兩個(gè)指針移動(dòng)就能實(shí)現(xiàn)遍歷鏈表
p=head; //存儲(chǔ)頭指針,
p1=p->next; //存儲(chǔ)頭結(jié)點(diǎn)指針域
while(p->next!=NULL)//通過(guò)循環(huán)逐個(gè)刪除結(jié)點(diǎn)
{
//剛開(kāi)始p指向head,即p存儲(chǔ)了頭結(jié)點(diǎn)head本身的指針,即p就是頭結(jié)點(diǎn)指針
delete p;//通過(guò)這一步釋放p所指向的內(nèi)容,即刪除頭結(jié)點(diǎn)內(nèi)容
i++;
p=p1;//p指向p1即下一個(gè)結(jié)點(diǎn),這時(shí)p1成為新鏈表的頭指針,因?yàn)橹暗念^結(jié)點(diǎn)已經(jīng)刪除
//p1原來(lái)指向頭結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)
p1=p1->next;//通過(guò)此步,p1指針重新指向,指向下一個(gè)結(jié)點(diǎn)實(shí)現(xiàn)指針移動(dòng)
}
delete p;//將最后一個(gè)結(jié)點(diǎn)刪除
printf("刪除結(jié)點(diǎn)個(gè)數(shù): %d\n",i);
}
void main()
{
node *head=creatlist();
display(head);
remove(head);
}
--------------GKXW
|
|