C語言程序設(shè)計(jì)結(jié)構(gòu)體_第1頁
C語言程序設(shè)計(jì)結(jié)構(gòu)體_第2頁
C語言程序設(shè)計(jì)結(jié)構(gòu)體_第3頁
C語言程序設(shè)計(jì)結(jié)構(gòu)體_第4頁
C語言程序設(shè)計(jì)結(jié)構(gòu)體_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 n9.1 結(jié)構(gòu)體類型結(jié)構(gòu)體類型n9.2 結(jié)構(gòu)體變量結(jié)構(gòu)體變量n9.3 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組n9.4 結(jié)構(gòu)體指針結(jié)構(gòu)體指針n9.5 鏈表概述鏈表概述n9.6 鏈表的基本操作鏈表的基本操作n學(xué)生信息表與結(jié)構(gòu)體數(shù)據(jù)學(xué)生信息表與結(jié)構(gòu)體數(shù)據(jù)n在程序中使用結(jié)構(gòu)體數(shù)據(jù)的一般過程在程序中使用結(jié)構(gòu)體數(shù)據(jù)的一般過程u 針對(duì)具體的組合數(shù)據(jù),定義專門針對(duì)具體的組合數(shù)據(jù),定義專門的結(jié)構(gòu)體數(shù)據(jù)類型。的結(jié)構(gòu)體數(shù)據(jù)類型。u 使用定義好的數(shù)據(jù)類型,定義要使用定義好的數(shù)據(jù)類型,定義要使用的結(jié)構(gòu)體變量。使用的結(jié)構(gòu)體變量。u 使用定義的結(jié)構(gòu)體變量存儲(chǔ)和表使用定義的結(jié)構(gòu)體變量存儲(chǔ)和表示結(jié)構(gòu)體數(shù)據(jù)。示結(jié)構(gòu)體數(shù)據(jù)。n定義結(jié)構(gòu)體類型的一般

2、格式定義結(jié)構(gòu)體類型的一般格式struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員表成員表;說明:說明: “結(jié)構(gòu)體名結(jié)構(gòu)體名”是用戶定義的結(jié)構(gòu)體的名字,在以后定義結(jié)構(gòu)體變是用戶定義的結(jié)構(gòu)體的名字,在以后定義結(jié)構(gòu)體變量時(shí),使用該名字進(jìn)行類型標(biāo)識(shí)。量時(shí),使用該名字進(jìn)行類型標(biāo)識(shí)。 “成員表成員表”是對(duì)結(jié)構(gòu)體數(shù)據(jù)中每一個(gè)數(shù)據(jù)項(xiàng)的變量說明,其格式是對(duì)結(jié)構(gòu)體數(shù)據(jù)中每一個(gè)數(shù)據(jù)項(xiàng)的變量說明,其格式與說明一個(gè)變量的一般格式相同,如下:與說明一個(gè)變量的一般格式相同,如下:數(shù)據(jù)類型名數(shù)據(jù)類型名 成員名成員名; “struct”是關(guān)鍵字,是關(guān)鍵字,“struct結(jié)構(gòu)體名結(jié)構(gòu)體名”是結(jié)構(gòu)體類型標(biāo)識(shí)符,是結(jié)構(gòu)體類型標(biāo)識(shí)符,在類型定義和類型

3、使用時(shí)在類型定義和類型使用時(shí)“struct”都不能省略。都不能省略。 結(jié)構(gòu)體名稱可以省略,此時(shí)定義的結(jié)構(gòu)體稱為無名結(jié)構(gòu)體。結(jié)構(gòu)體名稱可以省略,此時(shí)定義的結(jié)構(gòu)體稱為無名結(jié)構(gòu)體。如下是對(duì)學(xué)生組合數(shù)據(jù)的結(jié)構(gòu)體類型定義:如下是對(duì)學(xué)生組合數(shù)據(jù)的結(jié)構(gòu)體類型定義:struct student int num; /* 學(xué)號(hào)學(xué)號(hào) */ char name20; /* 姓名姓名 */ char sex; /* 性別性別 */ int age; /* 年齡年齡 */ int score; /* 成績成績 */ char addr30; /* 地址地址 */;當(dāng)結(jié)構(gòu)體的成員又是結(jié)構(gòu)體時(shí),稱為當(dāng)結(jié)構(gòu)體的成員又是結(jié)構(gòu)體時(shí)

4、,稱為結(jié)構(gòu)體的嵌套結(jié)構(gòu)體的嵌套。struct date int month; int day; int year; struct stud int num; char name20; char sex; int age; struct date birthday; char addr30;stud1,stud2; 先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量。先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量。n一般格式一般格式struct 結(jié)構(gòu)體類型名稱結(jié)構(gòu)體類型名稱 結(jié)構(gòu)體變量名;結(jié)構(gòu)體變量名;如:如:struct student student1,student2; 在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量。在定義結(jié)

5、構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量。n一般格式如下:一般格式如下:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員表成員表結(jié)構(gòu)體變量結(jié)構(gòu)體變量1, 結(jié)構(gòu)體變量結(jié)構(gòu)體變量2,結(jié)構(gòu)體變量,結(jié)構(gòu)體變量n;例如:例如:struct studentint num; char name20;char sex;int age; int score;char addr30; student1, student2; 不定義結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體類型變量。不定義結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體類型變量。n一般格式如下:一般格式如下:struct 成員表成員表;結(jié)構(gòu)體變量結(jié)構(gòu)體變量1,結(jié)構(gòu)體變量結(jié)構(gòu)體變量2,結(jié)構(gòu)體變量結(jié)構(gòu)體變量n

6、;例如:例如:structint num; char name20;char sex;int age; int score;char addr30;student1, student2;n引用結(jié)構(gòu)體成員的一般格式引用結(jié)構(gòu)體成員的一般格式結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名稱成員名稱如:如:student1.agen“.”是結(jié)構(gòu)體成員運(yùn)算符,是結(jié)構(gòu)體成員運(yùn)算符,“.”操作的優(yōu)先級(jí)在操作的優(yōu)先級(jí)在語言中是最高的,其結(jié)合性為從左到右。語言中是最高的,其結(jié)合性為從左到右。 n例例9-1 輸入一個(gè)學(xué)生的一組數(shù)據(jù),然后輸出其姓輸入一個(gè)學(xué)生的一組數(shù)據(jù),然后輸出其姓名、年齡和地址。名、年齡和地址。程序程序9-1說

7、明:說明: 對(duì)結(jié)構(gòu)體變量進(jìn)行輸入輸出時(shí),只能以成員引用的方對(duì)結(jié)構(gòu)體變量進(jìn)行輸入輸出時(shí),只能以成員引用的方式進(jìn)行,不能對(duì)結(jié)構(gòu)體變量進(jìn)行整體的輸入輸出。式進(jìn)行,不能對(duì)結(jié)構(gòu)體變量進(jìn)行整體的輸入輸出。 當(dāng)成員又是一個(gè)結(jié)構(gòu)體類型時(shí),若要引用它的成員,當(dāng)成員又是一個(gè)結(jié)構(gòu)體類型時(shí),若要引用它的成員,要從高到低逐級(jí)引用。如:要從高到低逐級(jí)引用。如: 與其他變量一樣,結(jié)構(gòu)體變量成員可以進(jìn)行各種運(yùn)算與其他變量一樣,結(jié)構(gòu)體變量成員可以進(jìn)行各種運(yùn)算。 n結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化,是在定義,是在定義結(jié)構(gòu)體變量的同時(shí),對(duì)其成員賦結(jié)構(gòu)體變量的同時(shí),對(duì)其成員賦初值。初值。n結(jié)構(gòu)體變量初始化的一般形式結(jié)構(gòu)體變量初始

8、化的一般形式struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 結(jié)構(gòu)體變量結(jié)構(gòu)體變量=初初始化數(shù)據(jù)始化數(shù)據(jù);n說明:說明: “ ”中的初始化數(shù)據(jù)用逗號(hào)中的初始化數(shù)據(jù)用逗號(hào)“,”分隔。分隔。 初始化數(shù)據(jù)的個(gè)數(shù)與結(jié)構(gòu)體成員初始化數(shù)據(jù)的個(gè)數(shù)與結(jié)構(gòu)體成員的個(gè)數(shù)應(yīng)相同,它們是按成員的的個(gè)數(shù)應(yīng)相同,它們是按成員的先后順序一一對(duì)應(yīng)賦值的。先后順序一一對(duì)應(yīng)賦值的。 每個(gè)初始化數(shù)據(jù)必須符合與其對(duì)每個(gè)初始化數(shù)據(jù)必須符合與其對(duì)應(yīng)的成員的數(shù)據(jù)類型。應(yīng)的成員的數(shù)據(jù)類型。例如:struct student int num; char name20; char sex; int age; int score; char addr30;stu=

9、9901,liujia,M,19,87,shanghai;數(shù)組元素是結(jié)構(gòu)體類型的數(shù)組,稱為結(jié)構(gòu)體數(shù)組。定義方法與其他結(jié)構(gòu)體變數(shù)組元素是結(jié)構(gòu)體類型的數(shù)組,稱為結(jié)構(gòu)體數(shù)組。定義方法與其他結(jié)構(gòu)體變量的定義方法相同量的定義方法相同 。 先定義結(jié)構(gòu)體類型,然后用結(jié)構(gòu)體類型定義數(shù)組變量。先定義結(jié)構(gòu)體類型,然后用結(jié)構(gòu)體類型定義數(shù)組變量。如:如:struct student information100;引用結(jié)構(gòu)體數(shù)組成員的一般格式:引用結(jié)構(gòu)體數(shù)組成員的一般格式:結(jié)構(gòu)體數(shù)組名結(jié)構(gòu)體數(shù)組名下標(biāo)下標(biāo).成員名成員名如:如:information20.score=91; 定義結(jié)構(gòu)體類型的同時(shí),定義數(shù)組變量。定義結(jié)構(gòu)體

10、類型的同時(shí),定義數(shù)組變量。 定義無類型名的結(jié)構(gòu)體數(shù)組變量。定義無類型名的結(jié)構(gòu)體數(shù)組變量。例如:例如:struct int year; int month; int day; date110,date210;n結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化,就是在定義結(jié)構(gòu)體數(shù)組,就是在定義結(jié)構(gòu)體數(shù)組的同時(shí),為結(jié)構(gòu)體數(shù)組元素賦初值。的同時(shí),為結(jié)構(gòu)體數(shù)組元素賦初值。n例如:例如:struct student info3= 9901,liujia,M,19,87,shanghai,9902,wangkai,M,18,89,beijing,9903,xiaohua,F,20,81,qingdao;例例9-2 按照

11、表按照表9-1的數(shù)據(jù)情況,輸入一個(gè)班級(jí)的學(xué)生信的數(shù)據(jù)情況,輸入一個(gè)班級(jí)的學(xué)生信息,并進(jìn)行如下處理:息,并進(jìn)行如下處理: 把學(xué)習(xí)成績?cè)诎褜W(xué)習(xí)成績?cè)?5以上的學(xué)生找出來,并輸出這部分以上的學(xué)生找出來,并輸出這部分學(xué)生如下信息:姓名、成績、地址。學(xué)生如下信息:姓名、成績、地址。 分別統(tǒng)計(jì)出男生和女生人數(shù)。分別統(tǒng)計(jì)出男生和女生人數(shù)。分析:分析:這個(gè)問題可以分成三個(gè)步驟處理:這個(gè)問題可以分成三個(gè)步驟處理: 定義一個(gè)結(jié)構(gòu)體類型,并用它定義一個(gè)存儲(chǔ)學(xué)生信息定義一個(gè)結(jié)構(gòu)體類型,并用它定義一個(gè)存儲(chǔ)學(xué)生信息的結(jié)構(gòu)體數(shù)組;的結(jié)構(gòu)體數(shù)組; 向結(jié)構(gòu)體數(shù)組中輸入學(xué)生數(shù)據(jù);向結(jié)構(gòu)體數(shù)組中輸入學(xué)生數(shù)據(jù); 統(tǒng)計(jì),并輸出結(jié)果。統(tǒng)

12、計(jì),并輸出結(jié)果。程序程序9-2n指向結(jié)構(gòu)體變量的指針,稱為指向結(jié)構(gòu)體變量的指針,稱為結(jié)構(gòu)體指針結(jié)構(gòu)體指針。與其他類型的指針一樣,結(jié)構(gòu)體指針既可與其他類型的指針一樣,結(jié)構(gòu)體指針既可以指向單一的結(jié)構(gòu)體變量,也可以指向結(jié)以指向單一的結(jié)構(gòu)體變量,也可以指向結(jié)構(gòu)體數(shù)組變量,結(jié)構(gòu)體指針還可以作函數(shù)構(gòu)體數(shù)組變量,結(jié)構(gòu)體指針還可以作函數(shù)的參數(shù)。的參數(shù)。 n定義結(jié)構(gòu)體指針變量的一般形式:定義結(jié)構(gòu)體指針變量的一般形式:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 *結(jié)構(gòu)體指針變量名結(jié)構(gòu)體指針變量名;例如:例如:struct student *p,*q;struct student stud1,info10;p=&stu

13、d1; / * p指向結(jié)構(gòu)體變量指向結(jié)構(gòu)體變量stud1 */q=info; /* q指向結(jié)構(gòu)體數(shù)組變量指向結(jié)構(gòu)體數(shù)組變量info */n指向結(jié)構(gòu)體變量的指針,稱為指向結(jié)構(gòu)體變量的指針,稱為結(jié)構(gòu)體指針結(jié)構(gòu)體指針。與其他類型的指針一樣,結(jié)構(gòu)體指針既可與其他類型的指針一樣,結(jié)構(gòu)體指針既可以指向單一的結(jié)構(gòu)體變量,也可以指向結(jié)以指向單一的結(jié)構(gòu)體變量,也可以指向結(jié)構(gòu)體數(shù)組變量,結(jié)構(gòu)體指針還可以作函數(shù)構(gòu)體數(shù)組變量,結(jié)構(gòu)體指針還可以作函數(shù)的參數(shù)。的參數(shù)。 n定義結(jié)構(gòu)體指針變量的一般形式:定義結(jié)構(gòu)體指針變量的一般形式:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 *結(jié)構(gòu)體指針變量名結(jié)構(gòu)體指針變量名;例如:例如:struct

14、 student *p,*q;struct student stud1,info10;p=&stud1; / * p指向結(jié)構(gòu)體變量指向結(jié)構(gòu)體變量stud1 */q=info; /* q指向結(jié)構(gòu)體數(shù)組變量指向結(jié)構(gòu)體數(shù)組變量info */n對(duì)指向結(jié)構(gòu)體數(shù)組的指針,當(dāng)指針進(jìn)行加對(duì)指向結(jié)構(gòu)體數(shù)組的指針,當(dāng)指針進(jìn)行加1或或減減1運(yùn)算時(shí),其結(jié)果就是將指針指向上一個(gè)或運(yùn)算時(shí),其結(jié)果就是將指針指向上一個(gè)或者下一個(gè)結(jié)構(gòu)體數(shù)組元素。者下一個(gè)結(jié)構(gòu)體數(shù)組元素。 例例9-4 結(jié)構(gòu)體指針用法示例。結(jié)構(gòu)體指針用法示例。#include stdio.h#include string.hstruct stud char

15、 *number; char name20; int score;main() struct stud student,*p; p=&student; p-number=991001; strcpy(p-name,changjiang); student.score=91; printf(n); printf(student No.%snname:%snscore:%dn,p-number,p-name,p-score); 例例9-5指向結(jié)構(gòu)體數(shù)組指針的應(yīng)用示例。指向結(jié)構(gòu)體數(shù)組指針的應(yīng)用示例。#include stdio.hstruct stud char *number; char

16、name20; int score;stu3=990103,xiaohua,81,990104,zhangli,82,990105,wangfeng,88;main() struct stud *p; printf(nstudent No. name scoren); for(p=stu;pnumber,p-name,p-score);例例9-8用結(jié)構(gòu)體指針作函數(shù)的參數(shù),改寫例用結(jié)構(gòu)體指針作函數(shù)的參數(shù),改寫例9-7的程序。的程序。#include stdio.h#define N 5 /* 全班學(xué)生數(shù)全班學(xué)生數(shù) */struct stu_info char num7; /* 學(xué)生學(xué)號(hào)學(xué)生學(xué)號(hào)

17、*/ int score; stu=990101,87,990102,89,990103,81,990104,82,990105,88; main ( ) void sort_stu(struct stu_info *,int); /* 排序函數(shù)聲明排序函數(shù)聲明 */ int i; sort_stu(stu,N); for(i=0;iN;i+) /* 輸出結(jié)構(gòu)體數(shù)組元素輸出結(jié)構(gòu)體數(shù)組元素 */ printf(%-10s%dn,stui.num,stui.score);void sort_stu(struct stu_info *p,int n) int i,j; struct stu_info

18、 temp; /* 定義結(jié)構(gòu)體變量,用于結(jié)構(gòu)體數(shù)據(jù)的交換定義結(jié)構(gòu)體變量,用于結(jié)構(gòu)體數(shù)據(jù)的交換 */ for(i=1;in;i+) /* 冒泡法排序,降序冒泡法排序,降序 */ for (j=0;jN-i;j+) if(pj.scorenext=p-next; 把把new的首地址存儲(chǔ)到結(jié)點(diǎn)的首地址存儲(chǔ)到結(jié)點(diǎn)p的指針域中。的指針域中。p-next=new;例例9-9 用插入結(jié)點(diǎn)的方法建立圖示的學(xué)生成績鏈表,鏈表用插入結(jié)點(diǎn)的方法建立圖示的學(xué)生成績鏈表,鏈表head有有10個(gè)結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)存儲(chǔ)一個(gè)學(xué)生的學(xué)號(hào)和學(xué)個(gè)結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)存儲(chǔ)一個(gè)學(xué)生的學(xué)號(hào)和學(xué)習(xí)成績數(shù)據(jù)。習(xí)成績數(shù)據(jù)。程序程序9-9n函數(shù)的功能函數(shù)

19、的功能ucreat_node()函數(shù):生成一個(gè)鏈表結(jié)點(diǎn)。函數(shù):生成一個(gè)鏈表結(jié)點(diǎn)。ucreat_list()函數(shù):生成有函數(shù):生成有n個(gè)個(gè)struct s_node型結(jié)型結(jié)點(diǎn)的鏈表,函數(shù)的返回值是鏈表的頭指針。點(diǎn)的鏈表,函數(shù)的返回值是鏈表的頭指針。uout_list()函數(shù):用于輸出函數(shù):用于輸出head鏈表的各結(jié)點(diǎn)值。鏈表的各結(jié)點(diǎn)值。n從鏈表中刪除結(jié)點(diǎn),就是撤銷結(jié)點(diǎn)在鏈表中的鏈接,把結(jié)點(diǎn)從鏈表從鏈表中刪除結(jié)點(diǎn),就是撤銷結(jié)點(diǎn)在鏈表中的鏈接,把結(jié)點(diǎn)從鏈表中孤立出來。在鏈表中刪除結(jié)點(diǎn)一般有兩個(gè)過程:中孤立出來。在鏈表中刪除結(jié)點(diǎn)一般有兩個(gè)過程:u把指定的結(jié)點(diǎn)從鏈表中拿下來,它需要通過修改有關(guān)結(jié)點(diǎn)的指把

20、指定的結(jié)點(diǎn)從鏈表中拿下來,它需要通過修改有關(guān)結(jié)點(diǎn)的指針域來實(shí)現(xiàn);針域來實(shí)現(xiàn);u釋放該結(jié)點(diǎn)使用的內(nèi)存空間,它需要使用釋放該結(jié)點(diǎn)使用的內(nèi)存空間,它需要使用free()函數(shù)來實(shí)現(xiàn)。函數(shù)來實(shí)現(xiàn)。 刪除刪除p結(jié)點(diǎn)的過程:結(jié)點(diǎn)的過程: 若若p結(jié)點(diǎn)是鏈表的第一個(gè)結(jié)點(diǎn),則將結(jié)點(diǎn)是鏈表的第一個(gè)結(jié)點(diǎn),則將p指針域的地址保存到指針域的地址保存到head中,中,使使p的后繼結(jié)點(diǎn)成為的后繼結(jié)點(diǎn)成為head鏈表的第一個(gè)結(jié)點(diǎn),然后轉(zhuǎn)步驟鏈表的第一個(gè)結(jié)點(diǎn),然后轉(zhuǎn)步驟。修改指針的操作如下:修改指針的操作如下:head=head-next;或或head=p-next; 若若p結(jié)點(diǎn)不是鏈表的第一個(gè)結(jié)點(diǎn),則首先從結(jié)點(diǎn)不是鏈表的第一個(gè)

21、結(jié)點(diǎn),則首先從head開始,找到開始,找到p結(jié)點(diǎn)結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)q,然后使,然后使q的指針域存儲(chǔ)的指針域存儲(chǔ)p的后繼結(jié)點(diǎn)的地址,這樣的后繼結(jié)點(diǎn)的地址,這樣沿鏈表的指針訪問鏈表中的結(jié)點(diǎn)時(shí),沿鏈表的指針訪問鏈表中的結(jié)點(diǎn)時(shí),p結(jié)點(diǎn)將不會(huì)被訪問到,亦即結(jié)點(diǎn)將不會(huì)被訪問到,亦即p結(jié)點(diǎn)從鏈表結(jié)點(diǎn)從鏈表head中被刪除了。中被刪除了。修改指針的操作如下:修改指針的操作如下:q-next=p-next; 釋放釋放p結(jié)點(diǎn)使用的內(nèi)存空間。結(jié)點(diǎn)使用的內(nèi)存空間。free(p); 刪除結(jié)刪除結(jié)點(diǎn)點(diǎn)p后后的的head鏈表鏈表 : n在鏈表中進(jìn)行查找,就是從鏈表的第一個(gè)結(jié)點(diǎn)開始,沿在鏈表中進(jìn)行查找,就是從鏈表的

22、第一個(gè)結(jié)點(diǎn)開始,沿著指針鏈,用查找值與鏈表結(jié)點(diǎn)逐個(gè)比較的過程。找到著指針鏈,用查找值與鏈表結(jié)點(diǎn)逐個(gè)比較的過程。找到符合要求的結(jié)點(diǎn)之后,停止查找過程,返回相應(yīng)結(jié)點(diǎn)的符合要求的結(jié)點(diǎn)之后,停止查找過程,返回相應(yīng)結(jié)點(diǎn)的指針,否則返回一個(gè)空指針。指針,否則返回一個(gè)空指針。n在在head鏈表中查找鏈表中查找data值為值為m的結(jié)點(diǎn)的過程,其中的結(jié)點(diǎn)的過程,其中p為為struct node型指針:型指針:u p=head;u 當(dāng)當(dāng)pNULL時(shí),若時(shí),若p-data=m,則找到要求,則找到要求結(jié)點(diǎn),查找結(jié)束,返回結(jié)點(diǎn)地址結(jié)點(diǎn),查找結(jié)束,返回結(jié)點(diǎn)地址p;否則,執(zhí)行下一;否則,執(zhí)行下一步步;當(dāng);當(dāng)p= NULL時(shí)

23、,鏈表中不存在要找的結(jié)點(diǎn),時(shí),鏈表中不存在要找的結(jié)點(diǎn),查找結(jié)束,返回空指針查找結(jié)束,返回空指針NULL;u p=p-next;u 重復(fù)重復(fù)、步驟。步驟。查找函數(shù)查找函數(shù)find() :#include stdio.hstruct node *find(struct node *head,int m) struct node *p=head; while(p!=NULL&p-data!=m) p=p-next; if(p=NULL) return(NULL) else return(p);例例9-10對(duì)圖示的對(duì)圖示的head鏈表,刪除其值是鏈表,刪除其值是x的結(jié)點(diǎn)。具體要的結(jié)點(diǎn)。具體要求

24、如下:求如下: 輸出被刪除結(jié)點(diǎn)的值;輸出被刪除結(jié)點(diǎn)的值; 當(dāng)指定值結(jié)點(diǎn)不存在時(shí),顯示一個(gè)提示信息;當(dāng)指定值結(jié)點(diǎn)不存在時(shí),顯示一個(gè)提示信息; x的值由鍵盤輸入。的值由鍵盤輸入。n分析:分析:該問題的關(guān)鍵點(diǎn)有兩點(diǎn):該問題的關(guān)鍵點(diǎn)有兩點(diǎn):u查找查找data等于等于x的結(jié)點(diǎn)的結(jié)點(diǎn)p;u刪除刪除p結(jié)點(diǎn)。結(jié)點(diǎn)。程序程序e9-10 n例例9-11 Josephus問題問題有有n個(gè)人圍成一圈,從個(gè)人圍成一圈,從1開始順序編號(hào)到開始順序編號(hào)到n,現(xiàn)在從,現(xiàn)在從1號(hào)開號(hào)開始順時(shí)針從始順時(shí)針從1數(shù)數(shù),數(shù)到數(shù)數(shù),數(shù)到m者自動(dòng)出列,然后從下一個(gè)人者自動(dòng)出列,然后從下一個(gè)人開始重新數(shù)數(shù),仍然每次數(shù)到開始重新數(shù)數(shù),仍然每次

25、數(shù)到m者自動(dòng)出列。請(qǐng)給出這者自動(dòng)出列。請(qǐng)給出這n個(gè)人出列的順序。個(gè)人出列的順序。方法:方法:用循環(huán)鏈表用循環(huán)鏈表 解決解決Josephus問題問題n用循環(huán)鏈表實(shí)現(xiàn)用循環(huán)鏈表實(shí)現(xiàn)Josephus問題的基本算法問題的基本算法首先設(shè)置首先設(shè)置p指針,其初值為指針,其初值為head。然后開始對(duì)。然后開始對(duì)p指向的結(jié)指向的結(jié)點(diǎn)數(shù)數(shù),每數(shù)一個(gè)結(jié)點(diǎn)后,點(diǎn)數(shù)數(shù),每數(shù)一個(gè)結(jié)點(diǎn)后,p指針便沿指針鏈下移一個(gè)位指針便沿指針鏈下移一個(gè)位置(置(p=p-next),指向下一個(gè)結(jié)點(diǎn)。當(dāng)),指向下一個(gè)結(jié)點(diǎn)。當(dāng)p指向的結(jié)點(diǎn)數(shù)指向的結(jié)點(diǎn)數(shù)到到m時(shí),輸出該結(jié)點(diǎn)的值并將其從鏈表中刪除(出列),時(shí),輸出該結(jié)點(diǎn)的值并將其從鏈表中刪除(出

26、列),這時(shí)使這時(shí)使p指向下一個(gè)結(jié)點(diǎn),然后從指向下一個(gè)結(jié)點(diǎn),然后從1開始重新數(shù)數(shù)。當(dāng)鏈表開始重新數(shù)數(shù)。當(dāng)鏈表中只有一個(gè)結(jié)點(diǎn)時(shí),數(shù)數(shù)結(jié)束,輸出該結(jié)點(diǎn)。中只有一個(gè)結(jié)點(diǎn)時(shí),數(shù)數(shù)結(jié)束,輸出該結(jié)點(diǎn)。 只有一個(gè)結(jié)點(diǎn)只有一個(gè)結(jié)點(diǎn)的循環(huán)鏈表的循環(huán)鏈表程序程序9-111結(jié)構(gòu)體是一種新型的數(shù)據(jù)類型,它與前面使用的數(shù)據(jù)類型的主要區(qū)結(jié)構(gòu)體是一種新型的數(shù)據(jù)類型,它與前面使用的數(shù)據(jù)類型的主要區(qū)別有兩點(diǎn):別有兩點(diǎn):u結(jié)構(gòu)體數(shù)據(jù)類型不是系統(tǒng)固有的,它需要由用戶自定義,在一個(gè)結(jié)構(gòu)體數(shù)據(jù)類型不是系統(tǒng)固有的,它需要由用戶自定義,在一個(gè)程序中可以有多個(gè)各不相同的結(jié)構(gòu)體類型;程序中可以有多個(gè)各不相同的結(jié)構(gòu)體類型;u一個(gè)結(jié)構(gòu)體數(shù)據(jù)類型是多

27、個(gè)不同成員的集合,這些成員可以具有一個(gè)結(jié)構(gòu)體數(shù)據(jù)類型是多個(gè)不同成員的集合,這些成員可以具有不同的類型。不同的類型。2“struct”是結(jié)構(gòu)體數(shù)據(jù)類型的關(guān)鍵字,定義和使用結(jié)構(gòu)體類型時(shí)都是結(jié)構(gòu)體數(shù)據(jù)類型的關(guān)鍵字,定義和使用結(jié)構(gòu)體類型時(shí)都必須使用該關(guān)鍵字。必須使用該關(guān)鍵字。3結(jié)構(gòu)體變量的定義有結(jié)構(gòu)體變量的定義有3種方法:先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變種方法:先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量;在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量;不定義結(jié)構(gòu)體類型名,量;在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量;不定義結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體類型變量。直接定義結(jié)構(gòu)體類型變量。4引用結(jié)構(gòu)體成員的方法主要有兩種:使用結(jié)構(gòu)體變量名引用結(jié)構(gòu)體引用結(jié)構(gòu)體成員的方法主要有兩種:使用結(jié)構(gòu)體變量名引用結(jié)構(gòu)體成員;通過指向結(jié)構(gòu)體變量的指針引用結(jié)構(gòu)體成員。成員;通過指向結(jié)構(gòu)體變量的指針引用結(jié)構(gòu)體成員。

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論