首先你要明確第4個的st并不是指針,并且結(jié)構(gòu)體并不能直接給一個結(jié)構(gòu)體,他不是基本類型。
在宜州等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),全網(wǎng)營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),宜州網(wǎng)站建設(shè)費(fèi)用合理。
第2個,的結(jié)構(gòu)體是在堆里邊的,需要,釋放。
第3個是在棧中的變量。
要做鏈表的話一定要用2;一般的使用3即可。
第一個明顯不合理,第一行分配的空間有什么用呢?
#?includestdio.h
#?includemalloc.h
struct?stu????//結(jié)構(gòu)體
{
int?age;
float?score;
char?name[100];
};
void?shuru?(int?len,?stu?*?pArr)??
{
int?i;
for(i?=?0;?ilen;?i++)
{
printf("請輸入第%d個學(xué)生的信息\n",i+1);
printf("name?=?");
scanf("%s",pArr[i].name);
printf("age?=?");
scanf("%d",?pArr[i].age);
printf("score?=?");
scanf("%f",?pArr[i].score);
}
return;
}?
int?main(void)
{
int?len?,i;
struct?stu?*?pArr,t;
printf("請輸入學(xué)生的個數(shù):\n");
printf("人數(shù)=?");
scanf("%d",len);
pArr?=?(struct?stu?*)malloc(len?*?sizeof(struct?stu));??
shuru(len,?pArr);
for(i=0;?ilen;?i++)
{
if(pArr[i].score??pArr[i+1].score)
{
t?=?pArr[i+1];
pArr[i+1]?=?pArr[i];
pArr[i]?=?t;
}
}
i?=0;
printf("\n\n排序后的學(xué)生信息為\n\n");
for(i=0;?ilen;?i++)
{
printf("name?=?%s\n",pArr[i].name);
printf("age?=?%d\n",pArr[i].age);
printf("score?=?%f\n",pArr[i].score);
printf("\n\n");
}
return?0;
}
這樣就行了,你的排序還沒實(shí)現(xiàn), 仿照輸入的函數(shù)實(shí)現(xiàn)就OK
可以如下定義:
templateclass T
class mix
{
public:
mix();//是實(shí)例化的時候才用得。
void sort_all();
void out();
private:
struct unit
{
T x;
unit *next;
}
static void del_p( unit *p);
//此處省略部分成員
};
但是出于程序可讀性的考慮,還是定義在類的外邊比較好,如下:
struct Student{
char number[20];
char name[20];
float math;
float english;
float history;
};
class a{
private:
struct Student stu;
}
如果在結(jié)構(gòu)體定義時,或定義后取了別名,可以用別名,否則不能省“struct”
如:typedef struct Teacher TEACHER;
則可以用TEACHER 代替struct Teacher
C語言的結(jié)構(gòu)體沒有存取控制權(quán)限,相當(dāng)于C++存取控制權(quán)限中的public:
#include stdio.h
char *SubjectName[] = {"數(shù)學(xué)","物理","化學(xué)","生物","語文","外語","政治","歷史","體育","美術(shù)","音樂"}; //科目名稱列表 可調(diào)整順序
#define SUBJECT 2 //科目數(shù) 可設(shè)定 1 - 11門,超過11門時得添加上行科目名稱列表
#define STUDENTS_MAX 100 //最大可輸入的學(xué)生數(shù)量 根據(jù)實(shí)際情況調(diào)整
typedef struct student{char name[12]; float core[SUBJECT+1];} Student;//最長姓名只許有五個漢字長度,超長會出錯 改一下這個名字長度或規(guī)定名字最長5個字多余的不輸入也成
Student Stu[STUDENTS_MAX]; //結(jié)構(gòu)體數(shù)組 全局變量 雖可以不用全局的,要是你自己寫了很多函數(shù),都要訪問它們,不如就讓它們做全局變量的好
void main()
{
int total,i,j,k;
printf("請輸入學(xué)生總數(shù)[1-%d]:",STUDENTS_MAX);
scanf("%d",total);
if(totalSTUDENTS_MAX){printf("超出設(shè)計(jì)總數(shù)了");exit(-1);}
else if(total1){printf("沒有學(xué)生統(tǒng)計(jì)個屁呀"); exit(-1);}
printf("請輸入學(xué)生成績,格式:\n\t姓名 ");
for(j=0;jSUBJECT;j++) printf("%s ",SubjectName[j]);
printf("\n");
for(i=0;itotal;i++)
{
Stu[i].core[SUBJECT]=0.0;//平均分
printf("No.%-3d ",i+1);
fflush(stdin); //清輸入緩沖區(qū)
scanf("%s %f",Stu[i].name,Stu[i].core[0]); //至少有一門科目的
for(j=1;jSUBJECT;j++) //其它科目 定義了多少就輸入多少
{
scanf("%f",Stu[i].core[j]);
Stu[i].core[SUBJECT] += Stu[i].core[j];
}
Stu[i].core[SUBJECT] /= SUBJECT; //平均分 只是求了沒有輸出
}
printf("\n不及格情況統(tǒng)計(jì):\n");
for(k=0,i=0;itotal;i++)
{
char putbuf[128],buf1[5];
int flag = 0;
strcpy(putbuf,Stu[i].name); //記下名字
for(j=0;jSUBJECT;j++)
if(Stu[i].core[j]60)
{
flag++;
strcat(putbuf," ");
strcat(putbuf,SubjectName[j]);//不及格的科目名稱
strcat(putbuf,":");
sprintf(buf1,"%4.1f",Stu[i].core[j]);strcat(putbuf,buf1);//分?jǐn)?shù)
}
if(flag)
{
printf("%s %d門不及格\n",putbuf,flag); //有不及格則輸出
k++; //統(tǒng)計(jì)不及格人數(shù)
}
}
if(!k)
printf("沒有不及格的學(xué)生");
else
printf("有不及格科目的學(xué)生個數(shù):%d",k);
}
//??吹接幸@類程序的,今天寫一個,給大家參考,別天天上來要程序啊,仿照這個自己編吧
//程序在VC7.1下編譯通過,測試運(yùn)行正常
如果在結(jié)構(gòu)體定義時,或定義后取了別名,可以用別名,否則不能省“struct”
如:typedef
struct
Teacher
TEACHER;
則可以用TEACHER
代替struct
Teacher
C語言的結(jié)構(gòu)體沒有存取控制權(quán)限,相當(dāng)于C++存取控制權(quán)限中的public:
追問:
那struct
Teacher
*creat(struct
Teacher
*head);
和Teacher
*creat(struct
Teacher
*head);
一樣嗎?如果不一樣的話有什么區(qū)別呢?
追答:
是一樣的,struct
Teacher
和Teacher只是同一東西的兩種不同寫法。
結(jié)構(gòu)體的定義如下所示,struct為結(jié)構(gòu)體關(guān)鍵字,tag為結(jié)構(gòu)體的標(biāo)志,member-list為結(jié)構(gòu)體成員列表,其必須列出其所有成員;variable-list為此結(jié)構(gòu)體聲明的變量。在一般情況下,tag、member-list、variable-list這3部分至少要出現(xiàn)2個。
結(jié)構(gòu)體的成員可以包含其他結(jié)構(gòu)體,也可以包含指向自己結(jié)構(gòu)體類型的指針,而通常這種指針的應(yīng)用是為了實(shí)現(xiàn)一些更高級的數(shù)據(jù)結(jié)構(gòu)如鏈表和樹等。如果兩個結(jié)構(gòu)體互相包含,則需要對其中一個結(jié)構(gòu)體進(jìn)行不完整聲明。
擴(kuò)展資料:
一、結(jié)構(gòu)體作用:
結(jié)構(gòu)體和其他類型基礎(chǔ)數(shù)據(jù)類型一樣,例如int類型,char類型,只不過結(jié)構(gòu)體可以做成你想要的數(shù)據(jù)類型,以方便日后的使用。
在實(shí)際項(xiàng)目中,結(jié)構(gòu)體是大量存在的,研發(fā)人員常使用結(jié)構(gòu)體來封裝一些屬性來組成新的類型。由于C語言內(nèi)部程序比較簡單,研發(fā)人員通常使用結(jié)構(gòu)體創(chuàng)造新的“屬性”,其目的是簡化運(yùn)算。
結(jié)構(gòu)體在函數(shù)中的作用不是簡便,其最主要的作用就是封裝。封裝的好處就是可以再次利用。讓使用者不必關(guān)心這個是什么,只要根據(jù)定義使用就可以了。
二、結(jié)構(gòu)體的大小與內(nèi)存對齊:
結(jié)構(gòu)體的大小不是結(jié)構(gòu)體元素單純相加就行的,因?yàn)槲覀冎髁鞯挠?jì)算機(jī)使用的都是32bit字長的CPU,對這類型的CPU取4個字節(jié)的數(shù)要比取一個字節(jié)要高效,也更方便。
所以在結(jié)構(gòu)體中每個成員的首地址都是4的整數(shù)倍的話,取數(shù)據(jù)元素時就會相對更高效,這就是內(nèi)存對齊的由來。每個特定平臺上的編譯器都有自己的默認(rèn)“對齊系數(shù)”(也叫對齊模數(shù))。
程序員可以通過預(yù)編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數(shù),其中的n就是你要指定的“對齊系數(shù)”。
三、結(jié)構(gòu)體的規(guī)則:
1、數(shù)據(jù)成員對齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第一個數(shù)據(jù)成員放在offset為0的地方,以后每個數(shù)據(jù)成員的對齊按照#pragma pack指定的數(shù)值和這個數(shù)據(jù)成員自身長度中,比較小的那個進(jìn)行。
2、結(jié)構(gòu)(或聯(lián)合)的整體對齊規(guī)則:在數(shù)據(jù)成員完成各自對齊之后,結(jié)構(gòu)(或聯(lián)合)本身也要進(jìn)行對齊,對齊將按照#pragma pack指定的數(shù)值和結(jié)構(gòu)(或聯(lián)合)最大數(shù)據(jù)成員長度中,比較小的那個進(jìn)行。
3、結(jié)合1、2可推斷:當(dāng)#pragma pack的n值等于或超過所有數(shù)據(jù)成員長度的時候,這個n值的大小將不產(chǎn)生任何效果。
參考資料來源:百度百科-結(jié)構(gòu)體