第十四章結構體、共用體和使用者自定義型別
當前講授
歷年真題
有以下程式
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.關於洛倫茲變換與伽利...