說明結構變量有以下三種方法。以上面定義的stu為例來加以說明。 1. 先定義結構,再說明結構變量。如: struct stu { int num; char name[20]; char sex; float score; }; struct stu boy1,boy2; 說明了兩個變量boy1和boy2為stu結構類型。也可以用宏定義使一個符號常量來表示一個結構類型,例如: #define STU struct stu STU { int num; char name[20]; char sex; float score; }; STU boy1,boy2;
2. 在定義結構類型的同時說明結構變量。例如: struct stu { int num; char name[20]; char sex; float score; }boy1,boy2;
[例7.11]寫一個函數,在鏈表中按學號查找該結點。 [code:1:8d8ee8c82c] TYPE * search (TYPE *head,int n) { TYPE *p; int i; p=head; while (p->num!=n && p->next!=NULL) p=p->next; /* 不是要找的結點后移一步*/ if (p->num==n) return (p); if (p->num!=n&& p->next==NULL) printf ("Node %d has not been found!/n",n); } [/code:1:8d8ee8c82c] 本函數中使用的符號常量TYPE與例7.10的宏定義相同,等于struct stu?辛礁魴尾?head是指向鏈表的指針變量,n為要查找的學號。進入while語句,逐個檢查結點的num成員是否等于n,假如不等于n且指針域不等于NULL(不是最后結點)則后移一個結點,繼續循環。如找到該結點則返回結點指針。 如循環結束仍未找到該結點則輸出“未找到”的提示信息。
[例7.12]寫一個函數,刪除鏈表中的指定結點。刪除一個結點有兩種情況: 1. 被刪除結點是第一個結點。這種情況只需使head指向第二個結點即可。即head=pb->next。其過程如圖7.5所示。 2. 被刪結點不是第一個結點,這種情況使被刪結點的前一結點指向被刪結點的后一結點即可。即pf->next=pb->next。其過程如圖7.6所示。 函數編程如下: [code:1:8d8ee8c82c] TYPE * delete(TYPE * head,int num) { TYPE *pf,*pb; if(head==NULL) /*如為空表, 輸出提示信息*/ { printf("/nempty list!/n"); goto end; } pb=head; while (pb->num!=num && pb->next!=NULL) /*當不是要刪除的結點,而且也不是最后一個結點時,繼續循環*/ {pf=pb;pb=pb->next;}/*pf指向當前結點,pb指向下一結點*/ if(pb->num==num) { if(pb==head) head=pb->next; /*如找到被刪結點,且為第一結點,則使head指向第二個結點, 否則使pf所指結點的指針指向下一結點*/ else pf->next=pb->next; free(pb); printf("The node is deleted/n"); } else printf("The node not been foud!/n");
[code:1:8d8ee8c82c] #define NULL 0 #define TYPE struct stu #define LEN sizeof(struct stu) struct stu { int num; int age; struct stu *next; }; TYPE * creat(int n) { struct stu *head,*pf,*pb; int i; for(i=0;i<n;i++) { pb=(TYPE *)malloc(LEN); printf("input Number and Age/n"); scanf("%d%d",&pb->num,&pb->age); if(i==0) pf=head=pb; else pf->next=pb; pb->next=NULL; pf=pb; } return(head); }
TYPE * delete(TYPE * head,int num) { TYPE *pf,*pb; if(head==NULL) { printf("/nempty list!/n"); goto end; } pb=head; while (pb->num!=num && pb->next!=NULL) {pf=pb;pb=pb->next;} if(pb->num==num) { if(pb==head) head=pb->next; else pf->next=pb->next; printf("The node is deleted/n"); } else free(pb); printf("The node not been found!/n");