第十四章結構體內容講解二

2021-03-12 04:19:40 字數 3323 閱讀 7523

第十四章結構體、共用體和使用者自定義型別

當前講授

歷年真題

有以下程式

struct stu

;void f(struct stu *p)

,}, *q=s;

++p ; ++q; *p=*q;

}main()

,};f(s);

printf("%s %d %3.0f\n", s[1].name, s[1].num, s[1].totalscore);

}程式執行後的輸出結果是( )。

a.sundan 20044 550      b.penghua 20045 537

c.lisiguo 20042 580      d.sundan 20041 703

【答案】b

【解析】此題考查的是結構陣列用作函式引數。在主函式中語句f(s);是用陣列名作為函式呼叫函式f(),陣列名是陣列首位址,因此,函式f()中的形參結構體指標變數p指向主函式中的陣列元素s[0]。在函式f()中,執行語句++p;將指標p往後移動了一位,所以指標p現在指向主函式中的陣列元素s[1];執行語句++p;將指標變數q指向函式f()中的結構陣列元素s[1];執行語句*p=*q;將函式f()中陣列元素s[1]賦給主函式中的陣列元素s[1],故最終輸出為:

penghua 20045 537,應該選擇b。

7.利用結構體變數構成鍊錶

(1)單向鍊錶的概念

struct slist

;typedef struct slist slist;

(2)建立帶有頭結點的單向鍊錶

【例】編寫函式creat_slistl,建立如上圖所示的帶有頭結點的單向鍊錶。

#include

#include

slist *creat_slist1()

r->next=『\0置鍊錶結束標誌*/

return h返回表頭指標*/:

}main()

(3)順序訪問鍊錶中各結點的資料域

【例】編寫函式print_slist,順序輸出單向鍊錶各結點資料域中的內容。

#include

#include

void print_slist(slist *head)

while(p!=『\o未到鍊錶尾,繼續迴圈*/

printf(「->end\n」);

}}(4)單向鍊錶中插入結點

【例】編寫函式insert_snode,它的功能是:在值為x的結點前插入值為y的結點,若值為x的結點不存在,則插在表尾。

在進行插入操作的過程中,可能遇到三種情況:

①鍊錶非空,值為x的結點存在,新結點應插在該結點之前。

②鍊錶非空,但值為x的結點不存在,按要求,新結點插在表尾。

③鍊錶為空表,這種情況相當於值為x的結點不存在,新結點插在表尾,即插在頭結點之後,作為表的第乙個結點。

#include

#include

insert_snode(slist *head,int x,int y)

注意:while((p!=『\o』)&&(p->data!

=x)) 中的兩個條件順序不能對調!當p==null時,c編譯程式將「短路」掉第二個條件,不做判斷,否則如果先判斷p->data!=x ,由於p中的值已為null,這時再要訪問p->data,就會發生訪問虛位址的錯誤操作。

(5)刪除單向鍊錶中的結點

為了刪除單向鍊錶中的某個結點,首先要找到待刪結點的前趨結點,然後將此前趨結點的指標域去指向待刪結點的後續結點,最後釋放被刪結點所佔儲存空間。

【例】編寫函式delete_snode,它的功能是:刪除鍊錶中值為x的結點。

#include

#include

delete_snode(slist *head,int x)

歷年真題

1.程式中已構成如下圖所示的不帶頭結點的單向鍊錶結構,指標變數s、p、q均已正確定義,並用於指向鍊錶結點,指標變數s總是作為頭指標指向鍊錶的第乙個結點。

若有以下程式段

q=s; s=s->next; p=s;

while(p->next) p=p->next;

p->next=q; q->next=null;

該程式段實現的功能是( ) 。

a.首結點成為尾結點     b.尾結點成為首結點

c.刪除首結點        d.刪除尾結點

隱藏答案

【答案】a

【解析】因為剛開始時s指向鍊錶首結點,所以語句q=s; 使q也指向鍊錶首結點。s=s->next; p=s;語句使s和p都指向首結點的下乙個結點。接下來是乙個while迴圈,迴圈條件為p->next,即當p沒有指向鍊錶尾時執行迴圈體p=p->next;讓p指向下乙個結點,所以當迴圈結束時,p指向鍊錶尾結點。

然後執行p->next=q;q->next=null;使q所指結點(原首結點)成為尾結點,此時s指向首結點。故應該選擇a。

2.有以下結構體說明和變數定義,如下圖所示,指標p、q、r分別指向乙個鍊錶中的三個連續結點。

struct node

*p, *q, *r;

現要將q和r所指結點的先後位置交換,同時要保持鍊錶的連續,以下錯誤的程式段是( )。

a.r->next=q; q->next=r->next; p->next=r;

b.q->next=r->next; p->next=r; r->next=q;

c.p->next=r; q->next=r->next; r->next=q;

d.q->next=r->next; r->next=q; p->next=r;

隱藏答案

【答案】a

【解析】選項a的第一步操作:r->next=q;執行結果如下圖:

執行完這步以後r原來所指結點後面的所有結點與原鍊錶斷開,無法保持鍊錶的連續,故選項a是錯誤的程式段。

選項b的三步操作:

第一步,q->next=r->next; 執行結果如下圖:

第二步,p->next=r; 執行結果如下圖:

第三步,r->next=q; 執行結果如下圖:

顯然,選項b的三步操作完成了q和r所指結點的先後位置交換,同時保持了鍊錶的連續的任務。請讀者自己通過**的方法分析選項c和d。綜上,選項a符合題意。

3.以下程式把三個nodetype型的變數鏈結成乙個簡單的鍊錶,並在while迴圈中輸出鍊錶結點資料域中的資料,請填空

#include

struct node

;typedef struct node nodetype;

main()

{ nodetype a,b,c,*h,*p;

a.data=10;b.data=20;c.data=30;h=&a;

a.next=&b;b.next=&c;c.next=』\0』;

第十四章作業內容

9 承上題,已知美國1985年總產出的貨幣價值是40 100億美元,巴西則為14 180億克魯扎多,參照第3題,計算兩國1985年的貨幣流通速度。巴西的貨幣流通發速度為什麼會如此之高?10 當我們討論短期匯率超調時,我們曾假定實際產出不變。現在,假定貨幣供給的增加在短期內提高了產生產出 第16章將給...

第十四章總結

2 基本內涵 海上風險 海上航行中發生的自然災害和意外事故。外來風險 海上風險意外的其他外來原因的風險 海損 海上航行中所遇到的損失。外來風險損失 海上風險意外的其他損失。3 保險公司的賠付原則 保險賠償原則有時也稱損失補償原則。保險賠償作為財產保險活動的最後環節,是保險雙方權利義務關係的核心內容,...

第十四章作業

第十四章狹義相對論 一.選擇題 1.下列幾種說法 1 對所有慣性系物理基本規律都是等價的 2 在真空中,光的速度與光的頻率 光源的運動狀態無關 3 在任何慣性系中,光在真空中沿任何方向的傳播速度都相同 正確的是 a 1 和 2 b 1 2 3 c 1 和 3 d 2 和 3 2.關於洛倫茲變換與伽利...