建設(shè)品牌網(wǎng)站公司關(guān)鍵詞檢測工具
?
????????C語言允許用戶自己建立由不同類型數(shù)據(jù)組成的組合型的數(shù)據(jù)結(jié)構(gòu),它稱為結(jié)構(gòu)體(structre)。 在程序中建立一個結(jié)構(gòu)體類型:
1.結(jié)構(gòu)體
建立結(jié)構(gòu)體
struct Student
{ int num; //學(xué)號為整型 char name[20]; //姓名為字符串 char sex; //性別為字符型 int age; //年齡為整型float score; //成績?yōu)閷嵭?char addr[30]; //地址為字符串
}; //注意最后有一個分號
?同時定義變量
struct Student
{ int num; char name[20];char sex; int age;float score;char addr[30];
}student1, student2;
?定義變量
struct Student student1, student2;
輸出變量
#include <stdio.h>
int main()
{ struct Student //聲明結(jié)構(gòu)體類型struct Student{ long int num; //以下4行為結(jié)構(gòu)體的成員char name[20];char sex;char addr[20];}a={10101,"Li Lin",'M',"123 Beijing Road"}; //定義結(jié)構(gòu)體變量a并初始化printf("NO.:%ld\nname:%s\nsex:%c\naddress:%s\n",a.num,a.name,a.sex,a.addr);return 0;
}
結(jié)構(gòu)體變量的初始化和引用
//結(jié)構(gòu)體變量的初始化和引用
student1.num=10010;
/*已定義了student1為student類型的結(jié)構(gòu)體變量,
則student1.num表示student1變量中的num成員,即student1的num(學(xué)號)成員*/
對結(jié)構(gòu)體變量的成員可以像普通變量一樣進行各種運算
同類的結(jié)構(gòu)體變量可以互相賦值。
student1=student2; //假設(shè)student1和student2已定義為同類型的結(jié)構(gòu)體變量
例題:輸入兩個學(xué)生的學(xué)號、姓名和成績,輸出成績較高的學(xué)生的學(xué)號、姓名和成績。
#include <stdio.h>
int main()
{ struct Student //聲明結(jié)構(gòu)體類型struct Student { int num;char name[20];float score;}student1,student2; //定義兩個結(jié)構(gòu)體變量student1,student2 scanf("%d%s%f",&student1.num,student1.name,&student1.score); //輸入學(xué)生1的數(shù)據(jù)scanf("%d%s%f",&student2.num,student2.name,&student2.score); //輸入學(xué)生1的數(shù)據(jù)printf("The higher score is:\n");if(student1.score>student2.score)printf("%d %s %6.2f\n",student1.num,student1.name,student1.score);else if(student1.score<student2.score)printf("%d %s %6.2f\n",student2.num,student2.name,student2.score);else{ printf("%d %s %6.2f\n",student1.num,student1.name,student1.score);printf("%d %s %6.2f\n",student2.num,student2.name,student2.score);}return 0;
}
2.使用結(jié)構(gòu)體數(shù)組
struct 結(jié)構(gòu)體名 {成員表列} 數(shù)組名[數(shù)組長度];
struct Person
{ char name[20];int count;
}
struct Person leader[3]; //leader是結(jié)構(gòu)體數(shù)組名
例題:有3個候選人,每個選民只能投票選一人,要求編一個統(tǒng)計選票的程序,先后輸入被選人的名字,最后輸出各人得票結(jié)果。
#include <string.h>
#include <stdio.h>
struct Person //聲明結(jié)構(gòu)體類型struct Person
{ char name[20]; //候選人姓名int count; //候選人得票數(shù)
}leader[3]={"Li",0,"Zhang",0,"Sun",0}; //定義結(jié)構(gòu)體數(shù)組并初始化int main()
{ int i,j;char leader_name[20]; //定義字符數(shù)組 for(i=1;i<=10;i++){ scanf("%s",leader_name); //輸入所選的候選人姓名for(j=0;j<3;j++)if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;}printf("\nResult:\n");for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);return 0;
}
3.結(jié)構(gòu)體指針
通過指向結(jié)構(gòu)體變量的指針變量輸出結(jié)構(gòu)體變量中成員的信息。
#include <stdio.h>
#include <string.h>
int main()
{ struct Student //聲明結(jié)構(gòu)體類型struct Student{ long num;char name[20];char sex;float score;};struct Student stu_1; //定義struct Student類型的變量stu_1 struct Student *p; //定義指向struct Student 類型數(shù)據(jù)的指針變量p p=&stu_1; //p指向stu_1 stu_1.num=10101; //對結(jié)構(gòu)體變量的成員賦值 strcpy(stu_1.name,"Li Lin"); //用字符串復(fù)制函數(shù)給stu_1.name賦值stu_1.sex='M';stu_1.score=89.5;printf("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score); //輸出結(jié)果 printf("\nNo.:%ld\nname:%s\nsex:%c\nscore:%5.1f\n",(*p).num,(*p).name,(*p).sex, (*p).score); return 0;
}
4.鏈表
4.1what is "linked list"
? ? ? ? 鏈表有一個“頭指針”變量,圖中以head表示,它存放一個地址,該地址指向一個元素。 鏈表中每一個元素稱為“結(jié)點”,每個結(jié)點都應(yīng)包括兩個部分:
?(1) 用戶需要用的實際數(shù)據(jù);
?(2) 下一個結(jié)點的地址。
???????? head指向第1個元素,第1個元素又指向第2個元素……直到最后一個元素,該元素不再指向其他元素,它稱為“表尾”,它的地址部分放一個“NULL”(表示“空地址”),鏈表到此結(jié)束。
?
struct Student
{ int num;float score;struct Student *next; //next是指針變量,指向結(jié)構(gòu)體變量
};
?
4.2建立簡單的靜態(tài)鏈表
Build a static linked list——"p"
#include <stdio.h>
struct Student //聲明結(jié)構(gòu)體類型struct Student
{ int num;float score;struct Student*next;
};
int main()
{ struct Student a,b,c,*head,*p; //定義3個結(jié)構(gòu)體變量a,b,c作為鏈表的結(jié)點a.num=10101; a.score=89.5; //對結(jié)點a的num和score成員賦值b.num=10103; b.score=90; //對結(jié)點b的num和score成員賦值c.num=10107; c.score=85; //對結(jié)點c的num和score成員賦值head=&a; //將結(jié)點a的起始地址賦給頭指針heada.next=&b; //將結(jié)點b的起始地址賦給a結(jié)點的next成員b.next=&c; //將結(jié)點c的起始地址賦給a結(jié)點的next成員c.next=NULL; //c結(jié)點的next成員不存放其他結(jié)點地址p=head; //使p指向a結(jié)點do{ printf("%ld %5.1f\n",p->num,p->score); //輸出p指向的結(jié)點的數(shù)據(jù)p=p->next; //使p指向下一結(jié)點}while(p!=NULL); //輸出完c結(jié)點后p的值為NULL,循環(huán)終止return 0;
}
?->? 代表指針指向結(jié)點數(shù)據(jù)
4.3建立簡單的動態(tài)鏈表
?
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
struct Student
{ long num;float score;struct Student*next;
};
int n; //n為全局變量,本文件模塊中各函數(shù)均可使用它
struct Student *creat(void)
//定義函數(shù)。此函數(shù)返回一個指向鏈表頭的指針
{ struct Student *head;struct Student *p1,*p2;n=0;p1=p2=(struct Student*) malloc(LEN); //開辟一個新單元scanf("%ld,%f",&p1->num,&p1->score);//輸入第1個學(xué)生的學(xué)號和成績head=NULL;while(p1->num!=0){ n=n+1;if(n==1) head=p1;else p2->next=p1;p2=p1;p1=(struct Student*)malloc(LEN);//開辟動態(tài)存儲區(qū),把起始地址賦給p1scanf("%ld,%f",&p1->num,&p1->score);//輸入其他學(xué)生的學(xué)號和成績}p2->next=NULL;return(head);
}
int main()
{ struct Student *pt;pt=creat(); //函數(shù)返回鏈表第一個結(jié)點的地址 printf("\nnum:%ld\nscore:%5.1f\n",pt->num,pt->score);//輸出第1個結(jié)點的成員值return 0;
};
4.4 輸出鏈表
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
struct Student //聲明結(jié)構(gòu)體類型struct Student
{ long num;float score;struct Student *next;
};
int n; //全局變量n
void print(struct Student*head) //定義print函數(shù)
{ struct Student*p; //在函數(shù)中定義struct Student類型的變量pprintf("\nNow,These %d records are:\n",n);p=head; //使p指向第1個結(jié)點if(head!=NULL) //若不是空表do{ printf("%ld %5.1f\n",p->num,p->score); //輸出一個結(jié)點中的學(xué)號與成績p=p->next; //p指向下一個結(jié)點}while(p!=NULL); //當(dāng)p不是"空地址"
}