1、第 十 一 章 结 构 体 与 共 用 体第 一 节 结 构体知 识 点 : 结 构 体 的 概 念 、 变 量 定 义 、 变 量 赋 值 、 调 用 方 法 ,重 要 程 度 : 结 构 体 : 是 一 个 整 体 , 由 多 个 元 素 结 构 在 一 起 构 成 得 一 个 新 的 类型 。 ( 和 数 组 类 似 )我 们 需 要 一 个 学 生 的 档 案 , 里 面 有 姓 名 , 性 别 , 身 高 , 年 龄 , 考 试平 均 分 。也 就 是 要 有 五 个 元 素 组 合 成 一 个 新 的 结 构 。 这 是 可 以 通 过 结 构 体 来构 造 学 员 的 档 案 信
2、 息 的 。 首 先 我 们 知 道 该 结 构 体 是 要 有 个 名 称 , 这 里 我们 把 含 有 这 五 个 元 素 的 组 成 的 结 构 体 称 为 student。姓 名 ( n ame) : 字 符 串 性 别 ( sex ) : 字 符 型身 高 ( tall) ; 实 数 年 龄 ( ag e): 整 型考 试 平 均 分 ( av erag e) : 实 数结 构 体 和 数 组 的 区 别 和 联 系 :in t a3 。 数 组 a中 又 三 个 元 素 , 是 a0 、 a1 、 a2 。可 以 包 含 多 个 元 素 , 但 是 各 个 元 素 是 相 同 类
3、型 的 数 据 的 集 合 。结 构 体 中 包 含 得 元 素 是 可 以 不 一 样 的 。结 构 体 的 特 点 : 、 结 构 体 可 以 由 多 个 元 素 组 成 , 这 个 和 数 组 一 样 。 、 结 构 体 中 各 成 员 在 内 存 中 占 据 连 续 的 存 储 单 元 , 也 和 数 组 一样 。 、 结 构 体 中 各 成 员 可 以 具 有 不 同 的 数 据 类 型 , 这 个 是 数 组 与 结 构体 最 重 要 的 区 别 。 1、 结 构 体 类 型 的 说 明变 量 是 要 说 明 的 , 结 构 体 也 是 一 样 。 说 明 的 一 般 形 式 如
4、下 :stru ct 结 构 体 名 类 型 名 1 成 员 名 1 ;类 型 名 2 成 员 名 2 ;类 型 名 n 成 员 名 n ;说 明 :( 1 ) stru ct是 关 键 字 , 结 构 体 名 、 成 员 名 都 是 用 户 自 定 义 的 标 识符 , 如 前 面 的 stu d en t是 结 构 体 名 称 , n ame对 应 的 是 姓 名 。( 2 ) 结 构 体 名 用 来 唯 一 标 识 该 结 构 体 , 可 以 省 略 不 写 , 也 就 是stu d en t可 以 省 略 。( 3 ) 根 据 需 要 结 构 体 中 所 含 的 成 员 可 以 是 任
5、 意 多 个 , 成 员 是 属 于该 结 构 体 , 可 以 和 其 它 结 构 体 中 成 员 重 复 , 不 会 有 影 响 。( 4 ) 结 构 体 说 明 一 定 要 以 分 号 “; ”结 尾 。考 试 重 点 : 结 构 体 关 键 字 ( stru ct) 、 结 构 体 变 量 名 ( stru ct stu d en tsstd1 ) 、 结 构 体 类 型 名 ( stru ct stu d en t) 之 间 的 区 别 ! ! !例 1: 构 造 一 个 结 构 体 stu d en t, 含 有 上 面 的 学 员 五 个 档 案 信 息 。stru ct stu
6、d en t ch ar n ame1 0 ;ch ar sex ;flo at tall;in t ag e ;flo at av erag e ; ;本 例 中 , 掌 握 以 下 信 息 :结 构 体 类 型 名 : student。结 构 体 包 含 成 员 变 量 个 数 : 5 个 。结 构 体 所 占 的 存 储 单 元 : 2 1 个 字 节 。结 构 体 类 型 所 占 的 存 储 单 元 数 是 : 该 结 构 体 中 所 有 成 员 占 用 的 存 储单 元 数 的 总 和 。 例 如 上 述 stu d en t结 构 体 占 用 2 1 字 节 的 内 存 空 间 (
7、 n ame占1 0 个 字 节 , sex 占 1 个 字 节 , tall占 4 个 字 节 , ag e占 2 个 字 节 , av erag e占 4 个字 节 ) , 各 个 成 员 的 内 存 地 址 是 连 续 的 。考 点 : 结 构 体 说 明 可 以 是 嵌 套 的 ( 当 作 概 念 题 目 记 忆 ) , 在 学 生 的档 案 中 , 我 们 要 加 上 他 的 出 生 日 期 , 那 么 出 生 的 日 期 是 有 年 、 月 、 日的 , 所 以 要 定 义 一 个 新 的 结 构 体 d ate来 存 放 三 个 新 的 成 员 , y ear、mo n th 、
8、 d ay 。 如 下 例 :例 2:stru ct stu d en t ch ar n ame1 0 ;ch ar sex ;flo at tall;stru ct d a te /* 这 里 就 是 一 个 嵌 套 的 结 构 体 声 明 * / in t yea r ;in t mo n th ;in t d a y ;b irth d a y ; /* b irth d a y是 结 构 体 d a te的 一 个 结 构 体 变 量 * /in t ag e ;flo at av erag e ;2、 定 义 结 构 体 类 型 的 变 量 、 指 针 变 量 和 数 组结 构 体
9、 : 例 二 中 的 stu d en t、 d ate都 是 结 构 体 类 型 名 , 他 是 一 种 成员 的 组 织 方 式 。结 构 体 变 量 : 例 二 中 的 b irth d ay , 它 是 含 有 d ate结 构 体 组 织 方 式 的一 个 变 量 。结 构 体 变 量 的 存 在 形 式 : 一 般 变 量 、 指 针 变 量 和 数 组 。 重 要 考 点 : 使 用 结 构 体 的 几 种 方 法 , 选 择 题 目 出 现 。 通 过 五 种 方 法 来 说 明 结 构 体 , 请 大 家 牢 牢 的 熟 练 背诵 ! ! !方 法 一 : 直 接 在 结 构
10、 体 类 型 说 明 之 后 定 义 结 构 体 变 量 。stru ct stu d en t ch ar n ame1 0 ;in t ag e ;flo at av erag e;student1 , * ps , student5 ;结 构 体 关 键 字 : stru ct结 构 体 类 型 名 : stru ct stu d en t结 构 体 变 量 : stu d en t1 : 是 一 个 结 构 体 变 量 。 这 里 只 有 一 个 学 生 的信 息 档 案 资 料 。 * p s: 一 个 基 类 型 为 结 构 体 类 型 的 指 针 变 量 。 操 作 的 时 候要
11、 按 指 针 的 方 法 。 p s可 以 指 向 任 意 stru ct stu d en t类 型的 变 量 。 如 可 以 给 p s赋 值 : p s= 以 让 p s指向 stu d en t结 构 体 变 量 。stu d en t5 :有 五 个 元 素 的 结 构 体 数 组 。 可 以 存 放 五 个 学 生的 档 案 资 料 。方 法 二 : 在 说 明 结 构 体 类 型 时 , 结 构 体 名 称 缺 省 , 那 么 可 以 直 接 定 义 结构 体 变 量 、 数 组 和 指 针 。stru ct /这 里 没 有 student了 .可 以 缺 省 的 ch ar
12、n ame1 0 ;flo at av erag e ; stu d en t1 , * p s , stu d en t5 ; 本 例 中 , 和 上 面 相 比 , 结 构 体 名 称 stu d en t没 有 。 那 么 这 种 情 况 下 :一 定 是 要 直 接 在 说 明 结 构 体 定 义 的 后 面 , 定 义 结 构 体 变 量 、 数 组 和 指针 。 这 种 情 况 下 , 结 构 体 类 型 的 说 明 只 可 以 定 义 一 次 变 量 、 数 组 和 指针 。方 法 三 : 先 说 明 结 构 体 类 型 , 再 进 行 变 量 的 定 义 。stru ct st
13、u d en t ch ar n ame1 0 ;flo at av erag e ; ;这 里 是 把 结 构 体 的 说 明 和 结 构 体 变 量 的 定 义 分 开 成 了 两 个 语 句 。注 意 : stru ct stu d en t s1 , * p s , stu 3 ;中 的 stru ct和 stu d en t一 定 要 在 一 起 .才 能 唯 一 地 确 定 所 说 明 的 结 构 体 类 型 。方 法 四 :使 用 ty p ed ef说 明 一 个 结 构 体 类 型 名 , 再 用 新 类 型 名 来 定 义 变量 。 ty pedef stru ct stu
14、 d en t ch ar n ame1 0 ;flo at av erag e; STUD ;STUD stu d en t1 , * p s , stu d en t5 ;要 想 到 替 代 。 STUD是 替 代 了struct student 这 个 类 型 的 名 称 。 所 以 STUD的 功 能 是 完 全 等 价 于 structstudent的 。方 法 五 : 使 用 ty p ed ef说 明 一 个 结 构 体 类 型 名 , 再 用 新 类 型 名 来 定 义 变量 。 但 是 类 型 名 stu d en t缺 省 。ty pedef struct cha r na
15、 me1 0 ;ch ar sex ;flo at av erag e ; STUD ;STUD stu d en t1 , * p s , stu d en t5 ;方 法 四 和 方 法 五 的 区 别 就 是 在 第 一 行 的 当 中 , 一 个 是 ty p ed ef stru ct stu d en t, 另 外 一 个 则 是 缺 省 了 stu d en t 变 成 了 ty p ed ef stru ct。经 典 考 题 :1 有 以 下 程 序 段 【 2006年 4月 真 题 】ty p ed ef stru ct NODE in t n u m;stru ct NOD
16、E * n ex t;OLD ;以 下 叙 述 中 正 确 的 是 :A) 以 上 的 说 明 形 式 非 法 B) NODE是 一 个 结 构 体 类 型C) OLD是 一 个 结 构 体 类 型 D) OLD是 一 个结 构 体 变 量答 案 : C第 二 节 结 构体 的 初 始 化 和 调 用1给 结 构 体 变 量 赋 初 值有 了 结 构 体 变 量 的 定 义 , 就 一 定 要 给 变 量 赋 初 值 。 我 们 从 最 简 单 的开 始 。例 1: 结 构 体 变 量 定 义 的 同 时 直 接 赋 初 值stru ct stu d en t ch ar n ame1 0 ;
17、ch ar sex ;flo at tall;in t ag e ;flo at av erag e ; stu d en t1 =“Lin “ ,1 .8 3 , W , 2 2 , 8 8 ; 例 2: 结 构 体 数 组 变 量 定 义 的 同 时 直 接 赋 初 值stru ct stu d en t ch ar n ame1 0 ;ch ar sex ;flo at tall;in t ag e ;flo at av erag e ;stu d en t2 =“Lin “ , W , 1 .8 3 , 2 2 , 8 8 , “Sh an “ , M ,1 .7 5 , 2 1 ,7
18、 7 ;结 构 体 数 组 和 前 面 学 习 的 数 组 是 很 大 的 相 似 之 处 。 这 里 的 结 构 体 数组 元 素 是 两 个 , 分 别 是 stu d en t0 , stu d en t1 。 那 么 stu d en t0 , stu d en t1 都 是 一 个 结 构 体 变 量 。2、 引 用 结 构 体 变 量 中 的 成 员 (考 试 重 点 )结 构 体 变 量 定 义 以 后 , 是 对 结 构 体 变 量 的 赋 值 , 定 义 和 赋 值 后 , 就是 如 何 去 使 用 这 些 变 量 了 。四 种 最 基 本 的 引 用 结 构 体 成 员 方
19、 法 :1 ) 结 构 体 变 量 名 .成 员 名 具 体 的 引 用 方 式 : stu d en t1 .n ame 2 ) 结 构 体 指 针 变 量 成 员 名 具 体 的 引 用 方 式 : p s n ame3 ) (* 结 构 体 指 针 变 量 ).成 员 名 具 体 的 引 用 方 式 : (* p s).n ame4 ) 结 构 体 变 量 数 组 名 .成 员 名 具 体 的 引 用 方 式 : stu d en t0 .n ame两 种 要 用 的 符 号 : “.” 和 “ ”点 “.”是 成 员 运 算 符 , 箭 头 “ ”称 为 结 构 指 向 运 算 符 。
20、 由 减 号 “-”和大 于 号 “”两 部 分 构 成 , 之 间 不 得 有 空 格 。stru ct stu d en t ch ar n ame1 0 ;ch ar sex ;flo at tall;in t ag e ;flo at av erag e ; stu d en t1 =“Lin “ ,W ,1 .8 3 , 2 2 , 8 8 ;* p =具 体 的 使 用 :p rin tf(“%s”,stu d en t1 .n ame); 输 出 的 就 是 字 符 串 Linstu d en t1 .sex 的 数 值 就 是 Wstu d en t1 .tall 的 数 值
21、就 是 1 .8 3stu d en t1 .ag e 的 数 值 就 是 2 2stu d en t1 .av erag e的 数 值 就 是 8 8-指 针 变 量 的 使 用 -p rin tf(“%s”,p -n ame); 输 出 的 就 是 字 符 串 Linp -sex 的 数 值 就 是 W p -sex 等 价 于 (* p ).sexp -tall 的 数 值 就 是 1 .8 3 p -tall 等 价 于 (* p ).tallp -ag e 的 数 值 就 是 2 2 p -ag e 等 价 于 (* p ).ag ep -av erag e的 数 值 就 是 8 8
22、 p -av erag e等 价 于 (* p ).av erag e难 点 : 通 过 结 构 体 指 针 变 量 来 引 用 结 构 体 成 员 时 , 与 + 、 -等 运 算符 组 成 表 达 式 时 , 要 根 据 运 算 符 的 优 先 级 运 算 。例 3 :stru ct ex mp le /* 定 义 了 一 个 结 构 体 类 型 ex mp le * / in t k ; /* 定 义 了 一 个 整 型 的 变 量 k * /ch ar * str ; /* 定 义 了 一 个 字 符 型 指 针 * str * / y =2 , Lin , * p er= /* 定
23、义 了 结 构 体 变 量 y 、 结 构 体 指 针 变 量* p er* /结 构 体 变 量 y 的 成 员 k 为 2 、 指 针 变 量 str为 “Lin ”。表 达 式 +per-k等 价 于 +(per-k) 是 使 k增 加 1 , 而 不 是 per地 址 增 加1 。因 为 运 算 符 -优 先 级 高 于 +, ( 考了 三 次 了 )表 达 式 (+p er)-k 在 访 问 k 之 前 使 p er地 址 增 加 1表 达 式 (p er+)-k等 价 于 p er+-k 在 访 问 了 p er所 指 向 变 量 y 中 的 k 成 员之 后 , 指 针 p er
24、增 1表 达 式 * p er-str等 价 于 * (p er-str) 引 用 的 是 变 量 y 中 str所 指 存 储 单 元表 达 式 * p er-str+等 价 于 * p er-(str+)在 引 用 了 str所 指 存 储 单 元 之 后 , 使 指针 str增 1 。表 达 式 (* p er-str)+ 使 str所 指 向 的 存 储 单 元 的 数 值 增 1表 达 式 * p er+-s 在 访 问 了 str所 指 存 储 单 元 之 后 , 使p er地 址 增 1 。一 .1 .不 能 对 数 组 整 体 访 问 , 只 能 逐 个 引 用 s1 .g r
25、ad e0 , 字 符 串 除 外 。2 .若 结 构 中 的 字 符 数 组 存 放 的 是 字 符 串 , 则 可 以 对 数 组 名 直 接 引用 。 s1 .n ame p s-n ame (* p s).n ame.3 .嵌 套 引 用 : 从 最 外 层 到 最 内 层 逐 层 引 用 , 每 层 引 用 用 ( .) 隔 开 。二 .对 结 构 体 成 员 的 输 入 输 出 (看 做 普 通 变 量 的 方 式 进 行 操 作 )1 .scn af(“%d ”, scan f(“%d ”,p s-ag e); scan f(“%d ”,s0 .ag e); 或 用g etssc
26、n af(“%d ”, p rin tf(“%d ”,s0 .ag e); p rin tf(“%d ”,p s-ag e) ;p rin tf(“%d ”,(* p s).ag e); 或 用 p u ts( ) p rin tf类 似第 三 节 函 数之 间 结 构 体 变 量 的 数 据 传 递函 数 参 数 的 传 递 是 有 ”数 值 ”和 ”地 址 ”。 结 构 体 类 型 值 和 结 构 体 类 型地 址 也 可 以 作 为 函 数 的 返 回 数 值 。 在 函 数 调 用 中 , 要 分 清 实 参 传 递 的 是普 通 变 量 还 是 地 址 。 如 果 是 地 址 , 就
27、 要 注 意 在 被 调 用 过 程 中 是 不 是 改 变了 该 指 针 指 向 的 变 量 , 如 果 改 变 了 , 就 会 影 响 实 参 的 值 。 传 递 的 是 普 通的 数 值 就 不 会 改 变 。( 1 ) 函 数 间 传 递 结 构 体 变 量 的 成 员结 构 体 变 量 中 的 每 个 成 员 可 以 是 简 单 的 变 量 (stu d en t1 .n ame)、 数 组(stu d en t.g rad e0 )和 指 针 变 量 stu d en t.n ame, 它 们 可 以 参 与 所 属 类 型 允 许的 任 何 操 作 。例 1: 结 构 体 变 量
28、 作 实 参 。stru ct ex mp le /* 定 义 了 一 个 结 构 体 类 型 ex mp le * / in t k ; /* 定 义 了 一 个 整 型 的 变 量 k * /ch ar * str ; /* 定 义 了 一 个 字 符 型 指 针 * str * / y =2 , Lin ,u se(struct x ) /* 定 义 了 一 个 函 数 u se, 它 的 形 参 类 型 是 stru ct ex mp le * / x .k =1 0 ; /* 不 会 改 变 主 函 数 中 y .k 的 数 值 , 因 为 传 的 是 数 值 不 是地 址 ! *
29、/main ()u se(y ); /* 主 函 数 中 实 参 是 结 构 体 变 量 y * / p rin tf(“%d ”,y .k );main 函 数 中 u se 调 用 函 数 是 把 结 构 体 变 量 y 作 为 普 通 变 量 来 进 行 处理 。 在 被 调 用 函 数 u se中 为 形 参 开 辟 一 个 新 的 存 储 单 元 来 存 放 实 参 传 递过 来 的 值 。 记 住 : 结 构 体 变 量 做 实 参 时 , 只 是 普 通 的 值 传 递 。 传 递 的 是数 值 , 在 被 调 用 函 数 不 会 影 响 实 参 的 值 。 所 以 主 函 数
30、打 印 出 来 y .k 还 是以 前 的 2 。例 2: 结 构 体 变 量 成 员 的 地 址 做 实 参# in clu d ety p ed ef stru ct /* 定 义 了 一 个 结 构 体 类 型 * / ch ar n ame1 0 ;ch ar sex ;in t ag e ;flo at tall ; EXM ;v o id u se(ch ar * p n ame , ch ar * p sex , in t p ag e ,flo at * p tall) /* 定 义 了 一 个 u se函 数 , 形 式 参 数 是 结 构 体 类 型 成 员 的 地 址 和
31、数 值 * /strcp y (p n ame , “Lin “) ; * p sex =”W”;p ag e=2 2 ;* p tall 1 .8 3 ;main ( ) EXM e=“Sh an “ , M , 1 8 , 1 .7 5 ;p rin tf(“(1 ) e in clu d e : %s, %c, %d , %fn “ , e.n ame , e.sex , e.ag e ,e.tall ) ;u se(e.na me , p rin tf(“(2 ) e in clu d e : %s, %c, %d ,%fn “ , e.n ame , e.sex , e.ag e ,
32、e.tall ) ;程 序 运 行 后 的 结 果 是 :(1 ) e in clu d e : Sh an , M, 1 8 , 1 .7 5 (2 ) e in clu d e : Lin , N, 1 8 , 1 .8 3分 析 : 本 例 中 初 开 e.ag e是 传 递 的 数 值 , 其 它 都 是 传 递 的 地 址 。 所 以最 后 的 打 印 出 来 的 时 候 , 传 地 址 的 参 数 由 于 在 函 数 u se中 都 改 变 了 , 所以 在 main 函 数 中 它 们 的 数 值 都 改 变 了 。 但 是 由 于 e.ag e是 以 数 据 的 形 式 传递
33、, 所 以 在 main 函 数 中 e.ag e是 没 有 发 生 改 变 的 。 从 结 构 体 类 型 的 说 明 中可 以 看 出 n ame是 一 个 字 符 数 组 名 , 即 是 一 个 地 址 。例 3: 结 构 体 变 量 地 址 做 实 参# in clu d ety p ed ef stru ct /* 定 义 了 一 个 结 构 体 类 型 * / ch ar n ame1 0 ;ch ar sex ;in t ag e ;flo at tall ; EXM ;v o id u se(EXM * per) /* 定 义 了 一 个 u se函 数 , 形 式 参 数 是
34、 结 构 体类 型 EXM的 地 址 * / strcp y (p er-n ame , “Lin “) ;p er-sex =N ;p er-ag e=2 2 ;p ertall=1 .8 3 ;main ( ) EXM e=“Sh an “ , M , 1 8 , 1 .7 5 ;p rin tf(“(1 ) e in clu d e : %s, %c, %d , %fn “ , e.n ame , e.sex , e.ag e ,e.tall ) ;u se(p rin tf(“(2 ) e in clu d e : %s, %c, %d ,%fn “ , e.n ame , e.sex
35、 , e.ag e ,e.tall ) ;程 序 运 行 的 结 果 是 :(1 ) e in clu d e : Sh an , M, 1 8 , 1 .7 5 (2 ) e in clu d e : Lin ,N,2 2 , 1 .8 3传 递 的 实 参 是 结 构 体 变 量 的 地 址 。 在 被 调 用 函 数 中 , 应 该 定 义 同 种结 构 体 类 型 的 指 针 形 参 。1 、 fun(int * a ) fun(整 型 变 量 得 地 址 ); 2 、 fun(sturct student * p) fun(结 构 体 变 量 的 地 址 ) 3 、 ty pedef
36、 struct student STUfun(STU * P) fun(结 构 体 变 量 的 地 址 )4 、 ty pedef struct STUfun(STU * P) fun(结 构 体 变 量 的 地 址 )例 4: 函 数 的 返 回 值 可 以 是 结 构 体 类 型struct student u se( )stru ct stu d en t std ;std .n ame = “Lin ”std .sex =Nstd .ag e=2 2 ;std .tall=1 .8 3 ;retu rn std;main ()stru ct stu d en t std 1 ;std
37、1 = u se() /* 函 数 返 回 的 是 一 个 结 构 体 , 所 以 接 受 也 要 是 一 个 结 构 体 * / 还 有 一 个 较 难 的 知 识 点 。 返 回 值 是 指 向 结 构 体 变 量 的 指 针 , 上 机 改错 题 目 、 填 空 题 目 的 重 点 。例 5: 函 数 的 返 回 值 可 以 是 结 构 体 类 型 地 址struct student * fu n ()stru ct stu d en t std ;std .n ame = “Lin ”std .ag e=2 2 ;retu rn main () stru ct stu d en t *
38、 p ;p = u se() /* 函 数 返 回 的 是 一 个 结 构 体 的 地 址 , 所 以 接 受 也 要 是 一 个 结 构 体指 针 * / 经 典 考 题 :1 、 有 以 下 程 序 段 【 2006年 4月 真 题 】stru ct st in t x ; in t * y ;* p t;in t a=1 ,2 ,b =3 ,4 ;stru ct st c2 =1 0 ,a,2 0 ,b ;p t=c;以 下 选 项 中 表 达 式 的 值 为 1 1 的 是 :A) * p t-y B) p t-x C) +p t-x D)(p t+)-x2 、 有 以 下 程 序 段
39、 【 2007年 9月 真 题 】 ty p ed ef stru ct ch ar n ame9 ; ch ar sex ; flo at sco re2 ;STU;STU f(STU a) STU b = “zh ao ”,m,8 5 .0 , 9 0 .0 ; in t i;strcp y (a.n ame, b .n ame);a.sex = b .sex ;fo r(i=0 ;istru ct lin k /* 定 义 了 一 个 结 构 体 , 名 称 叫 lin k * / in t d ata ; /* 定 义 了 lin k 的 整 型 的 成 员 数 据 d ata* /s
40、tru ct lin k * n ex t ; /* 定 义 了 一 个 基 类 型 为 结 构 体 stru ct lin k 的 指 针变 量 * / ; /* 有 个 分 号 , 必 不 可 少 * /ty p ed ef stru ct lin k LINK ; /* 用 ty p ed ef说 明 了 LINK为 结 构 体 类 型 stru ct stu d en t的 标 识 符 * /main ( ) LINK a , b , c , * p ,* s; /* 定 义 了 五 个 结 构 体 变 量 , 有 两 个 是 指针 变 量 * /a.d ata=1 ; b .d at
41、a=2 ; c.d ata=3 ; /* 前 三 个 结 构 体 变 量 依 次 给 字 符数 值 1 、 2 、 3 * /p = /* 指 针 p 指 向 了 结 构 变 量 a* /a.n ex t= /* 结 构 体 变 量 a的 指 针 成 员 指 向 了 b , a、 b链 接 在 一 起 * /b .n ex t= /* 结 构 体 变 量 b 的 指 针 成 员 指 向 了 c, b 、 c链接 在 一 起 * /c.n ex t=NULL; /* 结 构 体 变 量 c的 指 针 成 员 为 空 * /s=p ;wh ile(s ! =NULL) /* 当 s指 向 的 是
42、不 为 空 , 也 就 是 没 有 到 链表 末 尾 * / p rin tf(“ %c “ , s-d a ta ) ; /* 输 出 s指 向 结 构 体 变 量 的 d ata成员 * / s =s -next ; /* 使 s指 向 s的 n ex t成 员 指 向 的 结 构 体 变 量* /程 序 运 行 后 结 果 为 : 1 2 3链 表 中 是 有 多 个 结 构 体 变 量 , 这 些 结 构 体 变 量 称 为 链 表 的 结 点 , 如本 例 的 a、 b 、 c都 称 为 节 点 。 指 针 p 指 向 了 链 表 的 第 一 个 结 点 a, 即 指 向了 链 表
43、的 头 , 我 们 称 指 针 p 为 链 表 的 头 指 针 。a1 b2c3 p ( 2 ) 链 表 节 点 的 删 除 过 程链 表 中 有 一 个 重 要 的 操 作 : 节 点 的 删 除 。 例 如 , 要 把 上 例 中 b 结 点从 整 个 链 表 中 删 除 。方 法 一 : 采 用 语 句 a.n ex t=b .n ex t; b 节 点 的 指 针 成 员 n ex t中 是 c的 地址 。 也 就 是 将 a结 点 的 指 针 n ex t直 接 指 向 c结 点 , 这 样 就 把 结 点 b 从 链 表 中删 除 掉 了 。方 法 二 : a.n ex t= 这
44、个 时 候 是 直 接 把 节 点 c的 地 址 赋 值 给 节 点 a的成 员 指 针 n ex t。( 3 ) 链 表 两 个 节 点 交 换 处 理假 设 结 点 c后 面 还 有 若 干 个 结 点 , 现 在 要 交 换 节 点 a与 b 的 位 置 。 交换 b 与 c后 , c后 面 的 结 点 不 可 以 丢 失 。 则 可 以 用 以 下 语 句 实 现 :方 法 一 : b .n ex t=c.n ex t ; 方 法 二 : b .n ex t=c.n ex t ;c.n ex t= c.n ex t=a.n ex t ; a.n ex t= a.n ex t=采 用 方
45、 法 一 和 方 法 二 都 可 以 完 成 交 换 , 以 上 赋 值 语 句 请 读 者 牢 记 。( 4 ) 顺 序 访 问 链 表 中 各 结 点 的 数 据 域链 表 中 每 个 节 点 都 有 一 个 数 据 域 , 链 表 的 结 点 数 目 可 以 是 任 意 多个 。 有 的 时 候 我 们 要 访 问 这 些 数 据 。 同 时 我 们 需 要 掌 握 在 程 序 中 动 态 的分 配 多 个 结 点 的 方 法 。例 3: 建 立 一 个 有 任 意 多 个 结 点 的 链 表 。 ( 加 大 难 度 得 考 题 )# in clu d e# in clu d estru
46、 ct lin k /* 定 义 了 一 个 结 构 体 , 名 称 叫lin k * / ch a r d a ta ; /* d ata为 结 构 体 的 数 据 域 * /stru ct lin k * n ext ; /* * n ex t为 结 构 体 的 指 针 域 * /;ty p ed ef stru ct lin k LINK ;LINK * creatlist( ) /* 该 函 数 返 回 值 是 一 个 stru ct lin k 结 构 体 * / ch ar str ;LINK * h , * s , * r ;h =(LINK* )mallo c(sizeo f(
47、LINK) ; /* 分 配 头 结 点 ,强 制 转 成 了stru ct lin k 的 结 构 体 类 型 * /r=h ; str=g etch ar() ; /* 从 键 盘 读 入 数 据 * /wh ile(str!= n ) /* 如 输 入 的 不 是 回 车 符 , 则 继 续 生 成 结点 * / s=(LINK* )mallo c(sizeo f(LINK) ; /* 给 结 点 分 配 存 储 单元 * / s-d ata=ch ; /* 将 ch 的 值 赋 给 结 点 的 d ata成 员 * /r-n ex t=s; /* 新 结 点 连 到 表 尾 * /r=s ;