版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
C語言程序設計第8章結(jié)構(gòu)體程序設計
C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)整體概述THEFIRSTPARTOFTHEOVERALLOVERVIEW,PLEASESUMMARIZETHECONTENT第一部分第8章結(jié)構(gòu)體程序設計8.1結(jié)構(gòu)體數(shù)據(jù)概述8.2結(jié)構(gòu)體類型和結(jié)構(gòu)體變量8.3結(jié)構(gòu)體數(shù)組8.4結(jié)構(gòu)體指針變量8.5使用鏈表存儲數(shù)據(jù)8.6鏈表的基本操作8.7結(jié)構(gòu)體應用程序舉例C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.1結(jié)構(gòu)體數(shù)據(jù)概述結(jié)構(gòu)體數(shù)據(jù)是由多個數(shù)據(jù)項組合而成的數(shù)據(jù),如表8-1所示的學生信息表,當把每一行視為一個完整數(shù)據(jù)時,該數(shù)據(jù)就是一個結(jié)構(gòu)體數(shù)據(jù)。為了有效地處理這樣一類組合數(shù)據(jù),C語言提供了“結(jié)構(gòu)體”技術(shù),它可以把多個數(shù)據(jù)項組合起來,作為一個數(shù)據(jù)整體進行處理。學號姓名性別成績9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.1結(jié)構(gòu)體數(shù)據(jù)概述使用結(jié)構(gòu)體數(shù)據(jù)的一般過程針對具體組合數(shù)據(jù),定義結(jié)構(gòu)體數(shù)據(jù)類型。使用已定義的結(jié)構(gòu)體數(shù)據(jù)類型,定義結(jié)構(gòu)體變量。使用定義的結(jié)構(gòu)體變量存儲結(jié)構(gòu)體數(shù)據(jù)。
定義結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量存儲結(jié)構(gòu)體數(shù)據(jù)C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2結(jié)構(gòu)體類型和結(jié)構(gòu)體變量8.2.1結(jié)構(gòu)體程序示例8.2.2定義結(jié)構(gòu)體數(shù)據(jù)類型8.2.3結(jié)構(gòu)體變量的定義及使用C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.1結(jié)構(gòu)體程序示例例8-1利用結(jié)構(gòu)體變量存儲表8-1中第1行的學生數(shù)據(jù),并輸出其姓名和成績。#include<stdio.h>structstudent/*定義結(jié)構(gòu)體數(shù)據(jù)類型*/{ intnum; charname[20]; charsex; intscore;};intmain(){
structstudentstu={9011,"liujia",'M',87}; printf("Name:%s\n",); printf("Score:%d\n",stu.score); return0;}存儲結(jié)構(gòu)體數(shù)據(jù)C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.2定義結(jié)構(gòu)體數(shù)據(jù)類型定義結(jié)構(gòu)體類型的一般格式struct結(jié)構(gòu)體名{
成員表};說明:⑴“結(jié)構(gòu)體名”是用戶定義的結(jié)構(gòu)體的名字,在以后定義結(jié)構(gòu)體變量時,使用該名字進行類型標識。⑵“成員表”是對結(jié)構(gòu)體數(shù)據(jù)中每一個數(shù)據(jù)項的變量說明,其格式與說明一個變量的一般格式相同:數(shù)據(jù)類型名成員名;⑶“struct”是關(guān)鍵字,“struct結(jié)構(gòu)體名”是結(jié)構(gòu)體類型標識符,在類型定義和類型使用時“struct”都不能省略。⑷結(jié)構(gòu)體名稱可以省略,此時定義的結(jié)構(gòu)體稱為無名結(jié)構(gòu)體。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)9.1.2結(jié)構(gòu)體類型定義學生組合數(shù)據(jù)的結(jié)構(gòu)體類型定義:structstudent { intnum; charname[20]; charsex; intscore;};學號姓名性別成績9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.3結(jié)構(gòu)體變量的定義及使用1.定義結(jié)構(gòu)體變量⑴先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量。一般格式struct結(jié)構(gòu)體類型名稱結(jié)構(gòu)體變量名;如:structstudentstudent1,student2;C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.3結(jié)構(gòu)體變量的定義及使用⑵在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。一般格式struct結(jié)構(gòu)體名{
成員表}結(jié)構(gòu)體變量1,結(jié)構(gòu)體變量2,┅…,結(jié)構(gòu)體變量n;例如:
structstudent{
intnum;
charname[20];
charsex;
intscore;}student1,student2;C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.3結(jié)構(gòu)體變量的定義及使用⑶不定義結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體類型變量。一般格式struct{
成員表;}結(jié)構(gòu)體變量1,結(jié)構(gòu)體變量2,…,結(jié)構(gòu)體變量n;例如:
struct{
intnum;
charname[20];
charsex;
intscore;}student1,student2;C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.3結(jié)構(gòu)體變量的定義及使用2.引用結(jié)構(gòu)體成員引用結(jié)構(gòu)體成員的一般格式結(jié)構(gòu)體變量名.成員名稱例如:student1.score例8-2
輸入兩個學生的信息,然后輸出學習成績高的學生的姓名和成績信息。若成績相同時,只輸出第1個學生的信息。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)C語言程序設計-理論方法與實踐(第2版)8.2.3結(jié)構(gòu)體變量的定義及使用#include<stdio.h>structstudent{ intnum; charname[20]; charsex; intscore;}stu1,stu2;intmain(){ scanf("%d%s%c%d",&stu1.num,,&stu1.sex,&stu1.score); scanf("%d%s%c%d",&stu2.num,,&stu2.sex,&stu2.score); if(stu1.score>=stu2.score) printf("%s,%d\n",,stu1.score); else printf("%s,%d\n",,stu2.score);return0;}8.2.3結(jié)構(gòu)體變量的定義及使用說明:⑴初始化數(shù)據(jù)的個數(shù)與結(jié)構(gòu)體成員的個數(shù)應相同,它們按成員的先后順序一一對應賦值。⑵每個初始化數(shù)據(jù)須與其對應的成員的數(shù)據(jù)類型一致。structstudent{intnum;charname[20];charsex;intscore;}stu={9901,"liujia",'M',87};成員初始化數(shù)據(jù)數(shù)據(jù)類型stu.num9901intstu.nameliujiacharstu.sexMcharstu.score87int3.結(jié)構(gòu)體變量的初始化struct
結(jié)構(gòu)體名結(jié)構(gòu)體變量={初始化數(shù)據(jù)};C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3結(jié)構(gòu)體數(shù)組8.3.1結(jié)構(gòu)體數(shù)組的定義及元素引用8.3.2結(jié)構(gòu)體數(shù)組的初始化8.3.3結(jié)構(gòu)體數(shù)組應用示例C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3.1結(jié)構(gòu)體數(shù)組的定義及元素引用數(shù)組元素是結(jié)構(gòu)體類型的數(shù)組,稱為結(jié)構(gòu)體數(shù)組。定義方法與其他結(jié)構(gòu)體變量的定義方法相同。⑴先定義結(jié)構(gòu)體類型,然后用結(jié)構(gòu)體類型定義數(shù)組變量。例如:
structstudentinformation[100];⑵定義結(jié)構(gòu)體類型的同時,定義數(shù)組變量。例如:structstudent{intyear;intmonth;intday;}date1[10],date2[10];C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3.1結(jié)構(gòu)體數(shù)組的定義及元素引用⑶定義無類型名的結(jié)構(gòu)體數(shù)組變量。例如:struct{intyear;intmonth;intday;}date1[10],date2[10];引用結(jié)構(gòu)體數(shù)組成員的一般格式結(jié)構(gòu)體數(shù)組名[下標].成員名information[20].score=91;C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3.2結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化例如:structstudentinfo[3]={{9901,"liujia",'M',87},{9902,"wangkai",'M',89},{9903,"xiaohua",'F',81}};數(shù)組元素成員num成員name成員sex成員scoreinfo[0]9901liujiaM87info[1]9902wangkaiM89info[2]9903xiaohuaF81C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3.3結(jié)構(gòu)體數(shù)組應用實例例8-3
參照表8-1的數(shù)據(jù),輸入一個班級的學生信息,并把學習成績超過全班平均成績的學生找出來,輸出這部分學生的姓名和成績。分析⑴定義學生數(shù)據(jù)結(jié)構(gòu)體類型,定義存儲學生數(shù)據(jù)的結(jié)構(gòu)體數(shù)組。⑵向結(jié)構(gòu)體數(shù)組輸入學生數(shù)據(jù),并計算“成績”平均值。⑶查找結(jié)構(gòu)體數(shù)組中符合條件的數(shù)據(jù),并輸出結(jié)果。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3.3利用結(jié)構(gòu)體數(shù)組管理學生數(shù)據(jù)#include<stdio.h>#defineN5structstudent{ intnum; charname[20]; charsex; intscore;}stu[N];
intmain(void){inti,ave=0;for(i=0;i<N;i++){scanf("%d%s%c%d",&stu[i].num,stu[i].name,&stu[i].sex,&stu[i].score);ave+=stu[i].score;}ave=ave/N;printf("Average:%d\n",ave);for(i=0;i<N;i++)
if(stu[i].score>ave)printf("%-20s%d\n",stu[i].name,stu[i].score);return0;}
C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.4結(jié)構(gòu)體指針變量指向結(jié)構(gòu)體數(shù)據(jù)的指針變量,稱為結(jié)構(gòu)體指針變量。與其他類型的指針一樣,結(jié)構(gòu)體指針變量既可以指向單一的結(jié)構(gòu)體變量,也可以指向結(jié)構(gòu)體數(shù)組變量,結(jié)構(gòu)體指針還可以作函數(shù)的參數(shù)。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.4結(jié)構(gòu)體指針變量8.4.1結(jié)構(gòu)體指針變量的定義及使用8.4.2結(jié)構(gòu)體指針作函數(shù)的參數(shù)C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.4.1結(jié)構(gòu)體指針變量的定義及使用定義結(jié)構(gòu)體指針變量的一般形式:struct結(jié)構(gòu)體名*結(jié)構(gòu)體指針變量名;例如:structstudent*p,*q;structstudentstud1,info[10];p=&stud1;q=info;pstud1變量qinfo數(shù)組成員引用std1.num與p->num等價info[1].num與q[1]->num等價C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.4.1結(jié)構(gòu)體指針變量的定義及使用intmain(){ structstudentstu,*p; p=&stu;
p->num=9911; strcpy(p->name,"changjiang");
p->sex='F';
p->score=91; printf("Num:%d\nName:%s\n",p->num,p->name); printf("Sex:%c\nScore:%d\n",p->sex,p->score);return0;}例8-4
結(jié)構(gòu)體指針用法示例。/*programe8-4.c*/#include<stdio.h>#include<string.h>structstudent{ intnum; charname[20]; charsex; intscore;};C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.4.1結(jié)構(gòu)體指針變量的定義及使用例8-5指向結(jié)構(gòu)體數(shù)組的指針應用示例。#include<stdio.h>structstudent{ intnum; charname[20]; charsex; intscore;}stu[3]={9913,"xiaoli",'F',81,9914,"zhanghua",'M',82,9915,"wangjun",'F',88};intmain(){ structstudent*p;
for(p=stu;p<stu+3;p++) printf("%d%20s%3c%4d\n",p->num,p->name,p->sex,p->score);return0;}共3組初始化數(shù)據(jù)結(jié)構(gòu)體指針變量C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)intmain()
{voidoutput(structsudent*,int);
output(stu,N);
return0;
}
voidoutput(struct
student*p,intn)
{inti;
for(i=0;i<n;i++,p++)
printf("%d%20s%3c%4d\n",
p->num,p->name,p->sex,p->score);
}
/*programe8-6.c*/#include<stdio.h>#defineN3structstudent{intnum;charname[20];charsex;intscore;}stu[N]={9913,"xiaoli",'F',81,9914,"zhanghua",'M',82,9915,"wangjun",'F',88};結(jié)構(gòu)體指針8.4.2結(jié)構(gòu)體指針作函數(shù)的參數(shù)例8-6
結(jié)構(gòu)體指針作函數(shù)參數(shù)示例。結(jié)構(gòu)體數(shù)組名C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5使用鏈表存儲數(shù)據(jù) 8.5.1使用鏈表存儲數(shù)據(jù)示例8.5.2鏈表的特點8.5.3動態(tài)內(nèi)存管理函數(shù)8.5.4定義鏈表結(jié)構(gòu)C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.1鏈表的概念
鏈表是結(jié)構(gòu)體最重要的應用,它是一種非固定長度的數(shù)據(jù)結(jié)構(gòu),是一種動態(tài)存儲技術(shù),它能夠根據(jù)數(shù)據(jù)的結(jié)構(gòu)特點和數(shù)量使用內(nèi)存,尤其適用于數(shù)據(jù)個數(shù)可變的數(shù)據(jù)存儲。使用鏈表存儲表中前3個學生數(shù)據(jù)。學號姓名性別成績9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.1鏈表的概念
⑴申請一段內(nèi)存M,并把它分成兩部分:一部分存儲數(shù)據(jù);另一部分存儲下一個內(nèi)存段的地址。⑵
將一個學生數(shù)據(jù)存儲在M的數(shù)據(jù)區(qū)中。⑶若當前是第一個數(shù)據(jù),則將M的首地址保存在指針變量head中;否則將M的首地保存在上一個內(nèi)存段中。⑷
重復⑴、⑵、⑶的過程,直到所有數(shù)據(jù)存儲完畢,在最后一段內(nèi)存的地址區(qū)存儲結(jié)束標志。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.2鏈表的特點⑴
鏈表中的結(jié)點具有完全相同的結(jié)構(gòu),每一個結(jié)點存儲一個獨立的結(jié)構(gòu)體數(shù)據(jù);⑵鏈表的結(jié)點由系統(tǒng)隨機分配,它們在內(nèi)存中的位置可能是相鄰的,也可能是不相鄰的,結(jié)點之間的聯(lián)系是通過指針域?qū)崿F(xiàn)的;⑶為了能準確的定位第一個結(jié)點,每個鏈表要有一個表頭指針,從第一個結(jié)點開始,沿指針鏈能遍歷鏈表中的所有結(jié)點;⑷鏈表中的結(jié)點是在需要時用calloc()申請的,當不再需要時,應有free()函數(shù)釋放所占用的內(nèi)存段。⑸一個鏈表不需要事先說明它要包括的結(jié)點數(shù)目,在需要存儲新的數(shù)據(jù)時,就可增加結(jié)點,需要刪除數(shù)據(jù)時,就減少結(jié)點,鏈表結(jié)點是動態(tài)變化的。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.3動態(tài)內(nèi)存管理函數(shù)動態(tài)分配內(nèi)存按需分配內(nèi)存,申請獲得制。C語言通過動態(tài)內(nèi)存管理函數(shù),實現(xiàn)動態(tài)內(nèi)存管理。鏈表每一個結(jié)點的建立和刪除過程,都需要使用動態(tài)內(nèi)存管理函數(shù)。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.3動態(tài)內(nèi)存管理函數(shù)1.malloc()函數(shù)函數(shù)原型void*malloc(unsignedintsize);功能分配一塊長度為size字節(jié)的連續(xù)空間,并將該空間的首地址作為函數(shù)的返回值。如果函數(shù)沒有成功執(zhí)行,返回值為空指針(NULL或0)。由于返回的指針的基類型為void,應該通過顯式類型轉(zhuǎn)換后才能存入其他基類型的指針變量中,否則會有警告提示。例如:
int*p;
p=(int*)malloc(sizeof(int));8.5.3動態(tài)內(nèi)存管理函數(shù)2.free()函數(shù)函數(shù)原型voidfree(void*block);功能釋放以前分配給指針變量block的動態(tài)空間,但指針變量block不會自動變成空指針。例如:free(block)C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.3動態(tài)內(nèi)存管理函數(shù)3.calloc()函數(shù)函數(shù)原型void*calloc(unsignedint
n,unsigned
intsize);功能以size為單位大小共分配n*size個字節(jié)的連續(xù)空間,并將該空間的首地址作為函數(shù)的返回值。如果函數(shù)沒有成功執(zhí)行,返回值為空指針(NULL或0)。例如:int*p;p=(int*)calloc(10,sizeof(int));8.5.4定義鏈表結(jié)構(gòu)要定義一個鏈表結(jié)點的結(jié)構(gòu),須有兩項內(nèi)容:定義數(shù)據(jù)存儲所對應的各個成員;定義指向其他結(jié)點的指針成員。例如:假若要用鏈表逐個存儲一批整數(shù),其結(jié)點結(jié)構(gòu)可定義如下:structnode{intdata;structnode*next;};存儲具體數(shù)據(jù)存儲下一個節(jié)點的地址structnode類型的結(jié)點形成的鏈表頭指針空指針C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.4定義鏈表結(jié)構(gòu) 學號姓名性別成績9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88structstudent{ intnum; charname[20]; charsex; intscore; structstudent*next;};必須的成員,否則構(gòu)不成鏈表學生鏈表的結(jié)點定義結(jié)點C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6鏈表的基本操作8.6.1鏈表結(jié)點的插入8.6.2鏈表結(jié)點的刪除8.6.3鏈表結(jié)點的查找 C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結(jié)點的插入在鏈表中插入結(jié)點,就是把一個新結(jié)點連接到鏈表中。兩種情況:在空鏈表中插入一個結(jié)點;在鏈表的p結(jié)點之后插入一個新結(jié)點。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結(jié)點的插入1.在空鏈表中插入一個結(jié)點空鏈表就是頭指針head為空的鏈表。⑴申請一個new結(jié)點。new=(structnode*)calloc(1,sizeof(structnode));⑵為p結(jié)點填充數(shù)據(jù)。將要存儲的數(shù)據(jù)對應賦值給p結(jié)點數(shù)據(jù)域的各個成員。⑶修改有關(guān)指針的指向。①將new的next成員置空,使new結(jié)點成為鏈表的最后一個結(jié)點。②將head指向new結(jié)點。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結(jié)點的插入2.在head鏈表的p結(jié)點之后插入一個結(jié)點head鏈表和要插入結(jié)點new如圖所示。要將new結(jié)點插入在p結(jié)點之后,就是將new結(jié)點變成結(jié)點C的下一個結(jié)點,而使new的下一個結(jié)點成為結(jié)點D。⑴使new的指針域存儲結(jié)點D的首地址。new->next=p->next;⑵把new的首地址存儲到結(jié)點p的指針域中。p->next=new;C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結(jié)點的插入insert()函數(shù)功能:在head鏈表的p結(jié)點之后插入值為x的結(jié)點structstudent*insert(structnode*head,structnode*p,intx){ structnode*new; new=(structnode*)calloc(1,sizeof(structnode)); new->data=x; if(head==NULL) { head=new; head->next=NULL; } else { new->next=p->next; p->next=new; } returnhead;}C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結(jié)點的插入例8-7
用插入結(jié)點的方法建立圖示的學生成績鏈表,鏈表head有10個結(jié)點,每個結(jié)點存儲一個學生的學號和學習成績數(shù)據(jù)。程序:e8-7.c所需函數(shù)的功能creat_node()函數(shù):生成一個鏈表結(jié)點。creat_list()函數(shù):生成有n個structs_node型結(jié)點的鏈表,函數(shù)的返回值是鏈表的頭指針。out_list()函數(shù):用于輸出head鏈表的各結(jié)點值。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結(jié)點的插入#include<stdio.h>#defineN10structs_node/*定義結(jié)點類型*/{ charnum[4]; intscore; structs_node*next;};intmain(){ structs_node*create_node(void); structs_node*create_list(intn); voidout_list(structs_node*head); structs_node*head=NULL; head=create_list(N); out_list(head);return0;}C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結(jié)點的插入/*生成一個鏈表結(jié)點的函數(shù)*/structs_node*create_node(void){ structs_node*p; p=(structs_node*)calloc(1,sizeof(structs_node)); scanf("%s%d",p->num,&(p->score)); p->next=NULL; return(p);}C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結(jié)點的插入structs_node*create_list(intn){ structs_node*new,*p; structs_node*head; inti; if(n>=1) { new=create_node(); head=new; p=new; } for(i=2;i<=n;i++) { new=create_node(); p->next=new; p=new; } if(n>=1) return(head); else return(NULL);}建立含有n個結(jié)點的鏈表的函數(shù)C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結(jié)點的插入/*輸出head鏈表中所有結(jié)點的函數(shù)*/voidout_list(structs_node*head){ structs_node*p; if(head!=NULL) { p=head; while(p!=NULL) { printf("%s%d\n",p->num,p->score); p=p->next; } }}C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.2鏈表結(jié)點的刪除從鏈表中刪除結(jié)點,就是撤銷結(jié)點在鏈表中的鏈接,把結(jié)點從鏈表中孤立出來。刪除結(jié)點過程:把指定的結(jié)點從鏈表中拿下來,通過修改有關(guān)結(jié)點的指針域?qū)崿F(xiàn);釋放該結(jié)點使用的內(nèi)存空間,使用free()函數(shù)來實現(xiàn)。
刪除p結(jié)點時指針變化情況
刪除p結(jié)點后的head鏈表C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.2鏈表結(jié)點的刪除⑴若p結(jié)點是鏈表的第一個結(jié)點,則將p指針域的地址保存到head中,使p的后繼結(jié)點成為head鏈表的第一個結(jié)點,然后轉(zhuǎn)步驟⑶。修改指針操作:head=head->next;或head=p->next;⑵若p結(jié)點不是鏈表的第一個結(jié)點,則首先從head開始,找到p結(jié)點的前一個結(jié)點q,然后使q的指針域存儲p的后繼結(jié)點的地址,這樣沿鏈表的指針訪問鏈表中的結(jié)點時,p結(jié)點將不會被訪問到,亦即p結(jié)點從鏈表head中被刪除了。修改指針操作:q->next=p->next;⑶釋放p結(jié)點使用的內(nèi)存空間free(p);
在head鏈表中刪除p結(jié)點的delete()函數(shù)
刪除結(jié)點步驟C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)C語言程序設計-理論方法與實踐(第2版)8.6.2鏈表結(jié)點的刪除/*delete()函數(shù)*/structnode*delete(structnode*head,structnode*p){ structnode*q; if(p==NULL)return(head); if(p==head)head=head->next; else { q=head; while(q->next!=p)q=q->next; q->next=p->next; } free(p); returnhead;}8.6.3鏈表結(jié)點的查找鏈表查找是從鏈表的第一個結(jié)點開始,沿著指針鏈,用查找值與鏈表結(jié)點逐個比較的過程。找到符合要求的結(jié)點之后,停止查找過程,返回相應結(jié)點的指針,否則返回一個空指針。在head鏈表中查找data值為m的結(jié)點的過程,其中p為structnode型指針:⑴p=head;⑵當p≠NULL時,若p->data==m,則找到要求結(jié)點,查找結(jié)束,返回結(jié)點地址p;否則,執(zhí)行下一步⑶;當p==NULL時,鏈表中不存在要找的結(jié)點,查找結(jié)束,返回空指針NULL;⑶p=p->next,轉(zhuǎn)步驟⑵。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.3鏈表結(jié)點的查找查找函數(shù)find()structnode*find(structnode*head,intm){structnode*p=head;while(p!=NULL&&p->data!=m)p=p->next;if(p==NULL)returnNULL;elsereturnp;}C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.3鏈表結(jié)點的查找例8-8
對圖示的head鏈表,刪除其值是x的結(jié)點。具體要求:⑴輸出被刪除結(jié)點的值;⑵當指定值結(jié)點不存在時,顯示一個提示信息;⑶x的值由鍵盤輸入。程序e8-8.c
分析該問題的關(guān)鍵點有兩點:查找data等于x的結(jié)點p;刪除p結(jié)點。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.7結(jié)構(gòu)體應用程序舉例字符串加密學生數(shù)據(jù)綜合處理C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療機構(gòu)安全生產(chǎn)大檢查工作總結(jié)
- 吉林大學《水質(zhì)工程學I(雙語)》2021-2022學年第一學期期末試卷
- 食品安全保障食材配送方案
- 學校建筑幕墻工程設計方案
- 應急供水管網(wǎng)施工方案
- 2024-2025學年新教材高中數(shù)學第12章復數(shù)12.2.2復數(shù)的乘除運算課時素養(yǎng)評價含解析蘇教版必修第二冊
- 統(tǒng)考版2025屆高考歷史一輪復習課后限時集訓4219世紀以來的世界文學藝術(shù)含解析新人教版
- 2024-2025學年新教材高中數(shù)學第9章統(tǒng)計9.1.3獲取數(shù)據(jù)的途徑學案含解析新人教A版必修第二冊
- 2024年個人藝術(shù)表演經(jīng)紀合約
- 交通運輸防火技術(shù)應急方案
- 《高一學期期中考試動員》主題班會課件
- JTG F90-2015 公路工程施工安全技術(shù)規(guī)范
- 醫(yī)院人才梯隊建設與培養(yǎng)方案
- 上下班安全交通培訓
- 股骨頭置換術(shù)后護理查房
- 五谷知識課件
- 在線網(wǎng)課知慧《亞健康學(亞健康學)》單元測試考核答案
- 平面直角坐標系(單元教學設計)大單元教學人教版七年級數(shù)學下冊
- 江蘇省泰州市海陵區(qū)2023-2024學年七年級上學期期中語文試卷
- 培養(yǎng)小學生的邏輯思維能力
- 駕駛員技能比武方案
評論
0/150
提交評論