C語言-第八章、構造數據類型

8_1  結構體的概念和結構體變量node

_1.1  結構體的概念數組

    C語言中容許用戶本身構造由不一樣數據類型的數據所組成的集合體,稱爲結構體。結構體屬於數據類型,每個結構體有一個名字,稱爲結構體名。一個結構體由若干成員(也稱域)組成,每一個成員的數據類型能夠相同,也可不一樣。函數

_1.2  結構體類型的定義指針

struct  <結構體類型名>code

內存

    類型標識符  成員名1;get

     類型標識符  成員名2;string

    ……it

};io

例:

struct student
{
    char number[10];
    char name[20];
    char sex;
    int age;
    float score1;
    float score2;
};

注:末尾的「」切記不丟失。

_1.3  結構體類型變量的定義

(1)  先定義結構體類型,再定義結構變量

struct student
{
    char number[10];
    char name[20];
    char sex;
    int age;
    float score1;
    float score2;
};
struct student  s1, s2;  /*定義student類型的結構體類型變量s1, s2*/

特色:能夠將結構體類型的定義放到一個文件中(通常爲.h頭文件),如:#include<struct.h>

(2)  在定義結構類型的同時定義結構變量。

struct student
{
    char number[10];
    char name[20];
    char sex;
    int age;
    float score1;
    float score2;
}s1, s2;

(3)不定義結構類型,直接定義結構變量。

struct
{
    char number[10];
    char name[20];
    char sex;
    int age;
    float score1;
    float score2;
}s1, s2;

嵌套定義:

struct date 
{
	int month;
	int day;
	int year;
};
struct employee
{
	char name[10];
	char sex[3];
	int age;
	struct date birthday;
	char address[30];
	char tel[12];
}employee;

_1.4  結構體變量的引用

引用結構體成員方法以下:

結構體變量名.成員名

【例】:

s1.age=18;
gets(s1.name);

_1.5  結構體變量的初始化

struct student
{
    char number[10];
    char name[20];
    char sex;
    int age;
    float score1;
    float score2;
};
struct student s1,s2={"1002","WangHua","M",19,86,89 };

【例8-1】分析如下代碼

#include<stdio.h>
struct curriculum
{
	char name[30];
	float credit;
	float grade;
};

struct student
{
	char id[8];
	char name[20];
	struct curriculum  course;
}s1={"1003","LiHong","C",4,87};

int main()
{   struct student s2;
    printf("請輸入s2的信息:\n");
	printf("學號\t 姓名\t 課程名\t 學分\t 成績\n");
    scanf("%s\t%s\t%s\t%f\t%f",s2.id,s2.name,s2.course.name,&s2.course.credit,&s2.course.grade);
	printf("\n兩名學生的信息以下:\n\n學號\t姓名\t課程名\t學分\t成績\n");
	printf("%s\t%s\ t%s\t%.lf\t.2f\n",s1.name,s1.course.name,s1.course.credit,s1.course.grade);
	printf("%s\t%s\t%s\t%.lf\t.2f\n",s2.name,s2.course.name,s2.course.credit,s2.course.grade);
		return 0;
}

8.2  結構體數組

_2.1  結構體數組的定義

struct student
{
    char number[10];
    char name[20];
    char sex;
    int age;
    float score1;
    float score2;
};
struct student stu[50];  /*定義數組stu*/

_2.2  結構體的初始化

(1)在定義的時候賦初值

(2)定義完成後,用循環語句賦初值

_2.3  結構體數組舉例

【8-2】 對候選人得票的統計程序

設有候選人3名,N名選民參加投票,選民投票輸入候選人的姓名。投票結束後,輸入候選人得票結果。

#include<stdio.h>
#include<string.h>
#define N 5
struct condidate 
{   char name[10];
    int count;
}person[3]={{"LiMing",0},{"WangFeng",0}};
 
int main()
{   int i,j,invalid=0;
    char name[10];
	for (i=1;i<=N;i++)
	{
		printf("請輸入候選人姓名:");
		gets(name);
		for(j=0;j<3;j++)
			if (strcmp(name,person[j].name)==0)
			{
				person[j].count++;
				break;
			}
			if (j==3) invalid++;
	}
	printf("\n投票人數%d票,有效票%d票,無效票%d票。\n",N,N-invalid,invalid);
	printf("得票狀況:\n");
	for(i=0;i<3;i++)
        printf("%10s:%d票\n",person[i].name,person[i].count);
	return 0;
}

  8_3    結構體指針

_3.1  結構體指針與指向結構體變量的指針變量的概念

形式:struct 結構體名  *指針變量名        如:

struct student  *p;

_3.2  用指向結構體變量的指針變量引用結構體變量的成員

【例8-3】分析如下代碼及輸出結果。

#include<stdio.h>
#include<string.h>
struct student 
{
	char number[10];
	char name[20];
	float score1;
	float score2;
};

void output (struct student x)
{
	printf("number\tname\tscore1\tscore2\n");
	printf("%s\t%s\t%.2f\t%.2f\n",x.number,x.name ,x.score1 ,x.score2);
}

int main()
{
	struct student s1={"1001","ZhaoMin",70,65};
	struct student *p=&s1;
	printf("初始信息以下:\n");
    output (*p);
	p->score1 =80.5;
	p->score2 =95;
	printf("\n修改後信息以下:\n");
	output (s1);
	return 0;
}

_3.3  用指向結構體變量的指針變量引用結構數組元素

【例8-4】分析如下代碼及輸出結果

 

_3.4  用指向結構體變量的指針變量做爲函數參數

(1)結構體指針變量只能指向該結構體類型的變量,而不能指向結構體類型變量的成員。

(2)結構體數組名做函數實參是「地址傳遞」方式的函數調用。

(3)結構體變量做函數實參是「值傳遞」方式的函數調用。

(4)結構體指針變量做函數實參是「值傳遞」方式的函數調用,只不過傳遞的是一個地址值。

(5)注意理解和區別運算符「.」和「->」。「.」是成員運算符,它的左邊應爲結構體變量,而「->」是指向成員運算符,它的左邊應爲結構體指針。如:「p->score1」「*p.score1」以及「s1.score」三者是等價的。

_3.5  用指向結構體變量的指針變量處理鏈表

1.  鏈表的基本結構

鏈表中每個節點的數據類型都是一個自引用結構體類型(同一類型的數據)。如:

struct node
{   char Tel[20];
    char Tel[12];
    struct node *next ;
};

2.  鏈表的基本操做

創建鏈表,鏈表的輸出,在鏈表中插入、刪除、查找或統計節點等。

 

 

 

 

 

 

 

 

 

 

8.4  枚舉類型和共用體類型簡介

_4.1  枚舉類型

1.  枚舉類型的定義

定義形式:enum  枚舉類型名 { 枚舉表;};

(1)定義枚舉類型時,「枚舉表」中每一個枚舉常量的名稱必須是惟一的。

(2)枚舉類型是用標識符表示的整型常量的集合,枚舉常量是自動設置值的符號常量,起始值爲0;如:

enum months {JAN ,FEB ,MAR ,APR ,MAY ,JUN ,JUL ,AUG ,SEP ,OCT ,NOV ,DEC};

其中,各枚舉常量的值被依次自動設置爲整數0~11。

(3)也能夠採用在定義時指定常量初值,如:

enum months {JAN=1 ,FAB ,MAR ,APR ,MAY ,JUN ,AUG ,SEP ,OCT ,NOV ,DEC };

後面的值會自動自增,也能夠在中間或其餘位置指定不一樣的值。

(4)完成定義後,其值就不可更改了,但能夠做爲整型常量使用。

2.  枚舉類型變量的定義

形式:enum  枚舉類型名 枚舉變量名列表;如:

enum  weekday{sun,mon,tue,wed,thu,fri,sat};
enum  weekday  week;

另:與結構體相似,能夠在定義枚舉類型時定義枚舉變量,如:

enum  weekday{sun,mon,tue,wed,thu,fri,sat}week;

也能夠不聲明枚舉類型的名稱,而直接定義該類型的枚舉變量。如:

enum {sun,mon,tue,wed,thu,fri,sat}week;

 

3.  枚舉變量的引用

【例8-16】分析如下代碼及運行結果。

#include<stdio.h>
int main()
{
	enum weekday {SUM,MON,TUE,WED,THU,FRL,SAT};
	enum weekday date1,date2,date3;
	date1=SAT;
	date2=WED;
	date3=SUM;
	printf("date1=%d,date2=%d,date=%d\n",date1,date2,date3);
	return 0;
}

_4.2  共用體類型

1  .共用體類型的定義:

union<共用體名>

{成員表列};

2.  共用體變量的定義

與結構體類型的定義類似;如:

(1)先定義共用體類型,再定義變量。

union data
{   float v;
    Short int n;
    char c;
};
union data u1,u2;

(2)二者同時定義,如:

union data
{   float v;
    Short int n;
    char c;
}u1,u2;

(3)同時定義,省去共用體名,如:

union
{   float v;
    Short int n;
    char c;
}u1,u2;

注:該方法定義的共用體類型不能再用來定義另外的共用體類型變量。

3.   共用體變量的引用以及共用體類型數據的特色

只能逐個引用共用體變量的成員。

格式爲:u1.v  ,   u2 .n , u1.c

 (1)系統採用覆蓋技術,實現內存共享,因此在某一時刻存放的、起做用的是最後一次存入的成員值。

(2)共用體變量與其餘各成員的地址相同。

【例8-8】分析如下代碼及運行結果。

#include<stdio.h>
union u
{   char u1;
    short u2;
};
int main()
{
	union u a={0x9741};
	printf("1.%c %x\n",a.u1,a.u2);
	a.u1 ='a';
	printf("2.%c %x\n",a.u1,a.u2);
	return 0;
}
相關文章
相關標籤/搜索