C語言連結串列的建立插入等綜合實戰
阿新 • • 發佈:2018-12-09
系本人原創,轉載請註明出處:
程式設計老師讓寫一個連結串列的綜合運用,包括建立,檢視某個節點,刪除某個節點,插入某個節點,以及連結串列的逆序,還必須要有出錯提示和返回。QaQ,,,看見這麼多東西我就想嚶嚶嚶,
先放上鍊表的結構體:
typedef struct student
{
int num;
char name[10];
char sex;
struct student* next;
}Stu;
關於老生常談的連結串列建立,直接放原始碼了啦啦啦:
Stu* p1,*p2;//p2屬於中間臨時變數 n=0; if((p1=p2=(Stu*)malloc(LEN))==NULL) { printf("Malloc Error!"); } printf("\n\t\tPlease input the number, name and sex for students (it will be end when inputing 0) :\n"); scanf("%d%s%*c%c",&p1->num,p1->name,&p1->sex); while(p1->num!=0) { n++; if(n==1) head=p1; else p2->next=p1; p2=p1; if((p1=(Stu *)malloc(LEN))==NULL) { printf("Malloc Error!"); } scanf("%d%s%*c%c",&p1->num,p1->name,&p1->sex); } p2->next=NULL; return head;
此處要注意的是p2只是一個臨時的結構體指標,暫時儲存p1的值,然後p1再去開闢空間。
還需要注意的一點是scanf中字串和字元在一起時的處理,%s和%c之間要加一個%*c去吸收一個空格
列印連結串列就不說了,一直指向下一個next,直到空指標為之就OK了。
對於檢視某個節點或者刪除某個節點的時候,需要加一個node變數,用來計算連結串列的節點數,下面就放上刪除某個節點的程式碼了:
Stu* del(Stu*head) { Stu* p1,*p2; p2=p1=head; int num,k=0,node=1; if(head==NULL) { printf("\n\t\t\tPlease creat a single linked list pressing No.1"); getchar(); getchar(); return head; } printf("\n\t\t\tPlease input the node you wanna delete:"); scanf("%d",&num); for(;node!=num;node++,p1=p1->next) if(p1->next==NULL) { node=1; p1=head; printf("\n\t\t\tYour number is wrong, please input again:"); scanf("%d",&num); if(node==num) break; } node=1; p1=head; while(p1!=NULL) { if(node==num&&k==0) { head=p1->next; break; } if(node==num&&k!=0) p2->next=p1->next; p2=p1;//p2指向p1的上一個節點 p1=p1->next; k++; node++; } system("cls"); printf("\n\t\t\tOK!"); getchar(); getchar(); return head; }
這裡有一個節點數輸錯的報錯並返回機制:我可是想了好久才想到的,,,囧
方法就是先用一個for迴圈(當輸入的節點數和node不相等時繼續迴圈),當連結串列遍歷完畢後,如果還不相等就提示出錯並返回重新輸入。此處p2的作用和建立連結串列時的作用一樣。
接著就是插入某一節點的連結串列哈~(輸入0表示插入到連結串列的第一位),原始碼奉上:
Stu* insert(Stu * head) { Stu* p1,*p2; p1=head; int num,node=0; if(head==NULL) { printf("\n\t\t\tPlease creat a single linked list pressing No.1"); getchar(); getchar(); return head; } if((p2=(Stu*)malloc(LEN))==NULL) { printf("Malloc Error!"); } printf("\n\t\t\tPlease input the node you wanna insert(the first inputing 0):"); scanf("%d",&num); for(;node!=num;node++,p1=p1->next)//出錯機制 if(p1==NULL) { p1=head; node=0; printf("\n\t\t\tYour node is wrong, please input again:"); scanf("%d",&num); if(node==num) break; } p1=head; node=1; printf("\n\t\t\tPlease input the number, name and sex you wanna insert:"); scanf("%d%s%*c%c",&p2->num,p2->name,&p2->sex); while(p1!=NULL) { if(num==0) { p2->next=head; head=p2; break; } if(node==num&&num!=0) { p2->next=p1->next; p1->next=p2; break; } p1=p1->next; node++; } system("cls"); printf("\n\t\t\tOK!"); getchar(); getchar(); return head; }
此處p2 的作用是插入的那個節點。
剛開始學習連結串列的時候覺得插入最難,其實逆序比插入難好多(╯▽╰):
剛開始我只定義了一個指標就想逆序成功,結果成功被打臉,然後最後寫了虛擬碼才知道,需要三個結構體指標才行╭(╯^╰)╮
具體的辦法如下滴:
先令p2=p1->next;
然後p1->next=NULL;
p3=p2->next;
p2->next=p1;
然後再令p1=p3->next;開始迴圈
值得注意的時,每指向下一個時都需要檢驗是否為空哦。
放上程式碼:
Stu* reverse(Stu*head)
{
Stu *p1, *p2, *p3;
p1=head;
if(head==NULL)
{
printf("\n\t\t\tPlease creat a single linked list pressing No.1");
getchar();
getchar();
return head;
}
p2=p1->next;
p1->next=NULL;
if(p2==NULL)
{
printf("\n\t\t\tOK!");
getchar();
getchar();
return p1;
}
while(1)
{
p3=p2->next;//
p2->next=p1;
if(p3==NULL)
{
head=p2;break;
}
p1=p3->next;//
p3->next=p2;
if(p1==NULL)
{
head=p3;break;
}
p2=p1->next;//
p1->next=p3;
if(p2==NULL)
{
head=p1;break;
}
}
system("cls");
printf("\n\t\t\tOK!");
getchar();
getchar();
return head;
}
這就完成逆序了啦啦啦