C語言程序設計-第8章-結構體程序設計課件_第1頁
C語言程序設計-第8章-結構體程序設計課件_第2頁
C語言程序設計-第8章-結構體程序設計課件_第3頁
C語言程序設計-第8章-結構體程序設計課件_第4頁
C語言程序設計-第8章-結構體程序設計課件_第5頁
已閱讀5頁,還剩56頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C語言程序設計第8章結構體程序設計

C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)整體概述THEFIRSTPARTOFTHEOVERALLOVERVIEW,PLEASESUMMARIZETHECONTENT第一部分第8章結構體程序設計8.1結構體數據概述8.2結構體類型和結構體變量8.3結構體數組8.4結構體指針變量8.5使用鏈表存儲數據8.6鏈表的基本操作8.7結構體應用程序舉例C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.1結構體數據概述結構體數據是由多個數據項組合而成的數據,如表8-1所示的學生信息表,當把每一行視為一個完整數據時,該數據就是一個結構體數據。為了有效地處理這樣一類組合數據,C語言提供了“結構體”技術,它可以把多個數據項組合起來,作為一個數據整體進行處理。學號姓名性別成績9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.1結構體數據概述使用結構體數據的一般過程針對具體組合數據,定義結構體數據類型。使用已定義的結構體數據類型,定義結構體變量。使用定義的結構體變量存儲結構體數據。

定義結構體類型定義結構體變量存儲結構體數據C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2結構體類型和結構體變量8.2.1結構體程序示例8.2.2定義結構體數據類型8.2.3結構體變量的定義及使用C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.1結構體程序示例例8-1利用結構體變量存儲表8-1中第1行的學生數據,并輸出其姓名和成績。#include<stdio.h>structstudent/*定義結構體數據類型*/{ intnum; charname[20]; charsex; intscore;};intmain(){

structstudentstu={9011,"liujia",'M',87}; printf("Name:%s\n",); printf("Score:%d\n",stu.score); return0;}存儲結構體數據C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.2定義結構體數據類型定義結構體類型的一般格式struct結構體名{

成員表};說明:⑴“結構體名”是用戶定義的結構體的名字,在以后定義結構體變量時,使用該名字進行類型標識。⑵“成員表”是對結構體數據中每一個數據項的變量說明,其格式與說明一個變量的一般格式相同:數據類型名成員名;⑶“struct”是關鍵字,“struct結構體名”是結構體類型標識符,在類型定義和類型使用時“struct”都不能省略。⑷結構體名稱可以省略,此時定義的結構體稱為無名結構體。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)9.1.2結構體類型定義學生組合數據的結構體類型定義:structstudent { intnum; charname[20]; charsex; intscore;};學號姓名性別成績9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.3結構體變量的定義及使用1.定義結構體變量⑴先定義結構體類型,再定義結構體變量。一般格式struct結構體類型名稱結構體變量名;如:structstudentstudent1,student2;C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.3結構體變量的定義及使用⑵在定義結構體類型的同時定義結構體變量。一般格式struct結構體名{

成員表}結構體變量1,結構體變量2,┅…,結構體變量n;例如:

structstudent{

intnum;

charname[20];

charsex;

intscore;}student1,student2;C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.3結構體變量的定義及使用⑶不定義結構體類型名,直接定義結構體類型變量。一般格式struct{

成員表;}結構體變量1,結構體變量2,…,結構體變量n;例如:

struct{

intnum;

charname[20];

charsex;

intscore;}student1,student2;C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.2.3結構體變量的定義及使用2.引用結構體成員引用結構體成員的一般格式結構體變量名.成員名稱例如:student1.score例8-2

輸入兩個學生的信息,然后輸出學習成績高的學生的姓名和成績信息。若成績相同時,只輸出第1個學生的信息。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)C語言程序設計-理論方法與實踐(第2版)8.2.3結構體變量的定義及使用#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結構體變量的定義及使用說明:⑴初始化數據的個數與結構體成員的個數應相同,它們按成員的先后順序一一對應賦值。⑵每個初始化數據須與其對應的成員的數據類型一致。structstudent{intnum;charname[20];charsex;intscore;}stu={9901,"liujia",'M',87};成員初始化數據數據類型stu.num9901intstu.nameliujiacharstu.sexMcharstu.score87int3.結構體變量的初始化struct

結構體名結構體變量={初始化數據};C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3結構體數組8.3.1結構體數組的定義及元素引用8.3.2結構體數組的初始化8.3.3結構體數組應用示例C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3.1結構體數組的定義及元素引用數組元素是結構體類型的數組,稱為結構體數組。定義方法與其他結構體變量的定義方法相同。⑴先定義結構體類型,然后用結構體類型定義數組變量。例如:

structstudentinformation[100];⑵定義結構體類型的同時,定義數組變量。例如:structstudent{intyear;intmonth;intday;}date1[10],date2[10];C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3.1結構體數組的定義及元素引用⑶定義無類型名的結構體數組變量。例如:struct{intyear;intmonth;intday;}date1[10],date2[10];引用結構體數組成員的一般格式結構體數組名[下標].成員名information[20].score=91;C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3.2結構體數組的初始化結構體數組的初始化例如:structstudentinfo[3]={{9901,"liujia",'M',87},{9902,"wangkai",'M',89},{9903,"xiaohua",'F',81}};數組元素成員num成員name成員sex成員scoreinfo[0]9901liujiaM87info[1]9902wangkaiM89info[2]9903xiaohuaF81C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3.3結構體數組應用實例例8-3

參照表8-1的數據,輸入一個班級的學生信息,并把學習成績超過全班平均成績的學生找出來,輸出這部分學生的姓名和成績。分析⑴定義學生數據結構體類型,定義存儲學生數據的結構體數組。⑵向結構體數組輸入學生數據,并計算“成績”平均值。⑶查找結構體數組中符合條件的數據,并輸出結果。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.3.3利用結構體數組管理學生數據#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結構體指針變量指向結構體數據的指針變量,稱為結構體指針變量。與其他類型的指針一樣,結構體指針變量既可以指向單一的結構體變量,也可以指向結構體數組變量,結構體指針還可以作函數的參數。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.4結構體指針變量8.4.1結構體指針變量的定義及使用8.4.2結構體指針作函數的參數C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.4.1結構體指針變量的定義及使用定義結構體指針變量的一般形式:struct結構體名*結構體指針變量名;例如:structstudent*p,*q;structstudentstud1,info[10];p=&stud1;q=info;pstud1變量qinfo數組成員引用std1.num與p->num等價info[1].num與q[1]->num等價C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.4.1結構體指針變量的定義及使用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

結構體指針用法示例。/*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結構體指針變量的定義及使用例8-5指向結構體數組的指針應用示例。#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組初始化數據結構體指針變量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};結構體指針8.4.2結構體指針作函數的參數例8-6

結構體指針作函數參數示例。結構體數組名C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5使用鏈表存儲數據 8.5.1使用鏈表存儲數據示例8.5.2鏈表的特點8.5.3動態內存管理函數8.5.4定義鏈表結構C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.1鏈表的概念

鏈表是結構體最重要的應用,它是一種非固定長度的數據結構,是一種動態存儲技術,它能夠根據數據的結構特點和數量使用內存,尤其適用于數據個數可變的數據存儲。使用鏈表存儲表中前3個學生數據。學號姓名性別成績9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.1鏈表的概念

⑴申請一段內存M,并把它分成兩部分:一部分存儲數據;另一部分存儲下一個內存段的地址。⑵

將一個學生數據存儲在M的數據區中。⑶若當前是第一個數據,則將M的首地址保存在指針變量head中;否則將M的首地保存在上一個內存段中。⑷

重復⑴、⑵、⑶的過程,直到所有數據存儲完畢,在最后一段內存的地址區存儲結束標志。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.2鏈表的特點⑴

鏈表中的結點具有完全相同的結構,每一個結點存儲一個獨立的結構體數據;⑵鏈表的結點由系統隨機分配,它們在內存中的位置可能是相鄰的,也可能是不相鄰的,結點之間的聯系是通過指針域實現的;⑶為了能準確的定位第一個結點,每個鏈表要有一個表頭指針,從第一個結點開始,沿指針鏈能遍歷鏈表中的所有結點;⑷鏈表中的結點是在需要時用calloc()申請的,當不再需要時,應有free()函數釋放所占用的內存段。⑸一個鏈表不需要事先說明它要包括的結點數目,在需要存儲新的數據時,就可增加結點,需要刪除數據時,就減少結點,鏈表結點是動態變化的。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.3動態內存管理函數動態分配內存按需分配內存,申請獲得制。C語言通過動態內存管理函數,實現動態內存管理。鏈表每一個結點的建立和刪除過程,都需要使用動態內存管理函數。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.3動態內存管理函數1.malloc()函數函數原型void*malloc(unsignedintsize);功能分配一塊長度為size字節的連續空間,并將該空間的首地址作為函數的返回值。如果函數沒有成功執行,返回值為空指針(NULL或0)。由于返回的指針的基類型為void,應該通過顯式類型轉換后才能存入其他基類型的指針變量中,否則會有警告提示。例如:

int*p;

p=(int*)malloc(sizeof(int));8.5.3動態內存管理函數2.free()函數函數原型voidfree(void*block);功能釋放以前分配給指針變量block的動態空間,但指針變量block不會自動變成空指針。例如:free(block)C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.3動態內存管理函數3.calloc()函數函數原型void*calloc(unsignedint

n,unsigned

intsize);功能以size為單位大小共分配n*size個字節的連續空間,并將該空間的首地址作為函數的返回值。如果函數沒有成功執行,返回值為空指針(NULL或0)。例如:int*p;p=(int*)calloc(10,sizeof(int));8.5.4定義鏈表結構要定義一個鏈表結點的結構,須有兩項內容:定義數據存儲所對應的各個成員;定義指向其他結點的指針成員。例如:假若要用鏈表逐個存儲一批整數,其結點結構可定義如下:structnode{intdata;structnode*next;};存儲具體數據存儲下一個節點的地址structnode類型的結點形成的鏈表頭指針空指針C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.5.4定義鏈表結構 學號姓名性別成績9901liujiaM879902wangkaiM899903xiaohuaF819904zhangliF829905wangfengM88structstudent{ intnum; charname[20]; charsex; intscore; structstudent*next;};必須的成員,否則構不成鏈表學生鏈表的結點定義結點C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6鏈表的基本操作8.6.1鏈表結點的插入8.6.2鏈表結點的刪除8.6.3鏈表結點的查找 C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結點的插入在鏈表中插入結點,就是把一個新結點連接到鏈表中。兩種情況:在空鏈表中插入一個結點;在鏈表的p結點之后插入一個新結點。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結點的插入1.在空鏈表中插入一個結點空鏈表就是頭指針head為空的鏈表。⑴申請一個new結點。new=(structnode*)calloc(1,sizeof(structnode));⑵為p結點填充數據。將要存儲的數據對應賦值給p結點數據域的各個成員。⑶修改有關指針的指向。①將new的next成員置空,使new結點成為鏈表的最后一個結點。②將head指向new結點。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結點的插入2.在head鏈表的p結點之后插入一個結點head鏈表和要插入結點new如圖所示。要將new結點插入在p結點之后,就是將new結點變成結點C的下一個結點,而使new的下一個結點成為結點D。⑴使new的指針域存儲結點D的首地址。new->next=p->next;⑵把new的首地址存儲到結點p的指針域中。p->next=new;C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結點的插入insert()函數功能:在head鏈表的p結點之后插入值為x的結點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鏈表結點的插入例8-7

用插入結點的方法建立圖示的學生成績鏈表,鏈表head有10個結點,每個結點存儲一個學生的學號和學習成績數據。程序:e8-7.c所需函數的功能creat_node()函數:生成一個鏈表結點。creat_list()函數:生成有n個structs_node型結點的鏈表,函數的返回值是鏈表的頭指針。out_list()函數:用于輸出head鏈表的各結點值。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結點的插入#include<stdio.h>#defineN10structs_node/*定義結點類型*/{ 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鏈表結點的插入/*生成一個鏈表結點的函數*/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鏈表結點的插入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個結點的鏈表的函數C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.1鏈表結點的插入/*輸出head鏈表中所有結點的函數*/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鏈表結點的刪除從鏈表中刪除結點,就是撤銷結點在鏈表中的鏈接,把結點從鏈表中孤立出來。刪除結點過程:把指定的結點從鏈表中拿下來,通過修改有關結點的指針域實現;釋放該結點使用的內存空間,使用free()函數來實現。

刪除p結點時指針變化情況

刪除p結點后的head鏈表C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.2鏈表結點的刪除⑴若p結點是鏈表的第一個結點,則將p指針域的地址保存到head中,使p的后繼結點成為head鏈表的第一個結點,然后轉步驟⑶。修改指針操作:head=head->next;或head=p->next;⑵若p結點不是鏈表的第一個結點,則首先從head開始,找到p結點的前一個結點q,然后使q的指針域存儲p的后繼結點的地址,這樣沿鏈表的指針訪問鏈表中的結點時,p結點將不會被訪問到,亦即p結點從鏈表head中被刪除了。修改指針操作:q->next=p->next;⑶釋放p結點使用的內存空間free(p);

在head鏈表中刪除p結點的delete()函數

刪除結點步驟C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)C語言程序設計-理論方法與實踐(第2版)8.6.2鏈表結點的刪除/*delete()函數*/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鏈表結點的查找鏈表查找是從鏈表的第一個結點開始,沿著指針鏈,用查找值與鏈表結點逐個比較的過程。找到符合要求的結點之后,停止查找過程,返回相應結點的指針,否則返回一個空指針。在head鏈表中查找data值為m的結點的過程,其中p為structnode型指針:⑴p=head;⑵當p≠NULL時,若p->data==m,則找到要求結點,查找結束,返回結點地址p;否則,執行下一步⑶;當p==NULL時,鏈表中不存在要找的結點,查找結束,返回空指針NULL;⑶p=p->next,轉步驟⑵。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.6.3鏈表結點的查找查找函數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鏈表結點的查找例8-8

對圖示的head鏈表,刪除其值是x的結點。具體要求:⑴輸出被刪除結點的值;⑵當指定值結點不存在時,顯示一個提示信息;⑶x的值由鍵盤輸入。程序e8-8.c

分析該問題的關鍵點有兩點:查找data等于x的結點p;刪除p結點。C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)8.7結構體應用程序舉例字符串加密學生數據綜合處理C語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第2版)語言程序設計-理論方法與實踐(第

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論