第7章 結構體改編_第1頁
第7章 結構體改編_第2頁
第7章 結構體改編_第3頁
第7章 結構體改編_第4頁
第7章 結構體改編_第5頁
已閱讀5頁,還剩69頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第7章結構體與鏈表7.1結構體的引出7.2結構體變量7.3結構體數組7.4結構體類型的指針變量7.5結構體與函數7.6鏈表在實際問題中我們常需要把不同類型的幾個數據組合起來,構成一個整體,如學校中教師和學生的信息。學號姓名性別年齡入學成績所屬學院0501李明男19610信息0502張莉女19595信息0503王濤男20580控制職工編號姓名性別民族出生日期職稱學歷單位工齡1997025孫杰男漢1974.9講師大學信息92001016趙玫女回1978.3助教大學控制51985104鄭毅男漢1964.11教授大學管理217.1結構體的引出學號姓名性別年齡入學成績所屬學院0501李明男19610信息0502張莉女19595信息0503王濤男20580控制如何表示這樣的數據信息?結構體是由一些邏輯相關,但數據類型不同的分量組成的一組數據。學號姓名性別年齡入學成績所屬學院intnumcharname[10]charsexintageintscorecharinstitute[20]例:輸入三個學生的信息,并輸出#include<stdio.h>voidmain(){structstudent{intnum;charname[10];charsex;

intage;

intscore;charinstitute[20]};

structstudents1,s2,s3;

定義學生的結構體類型定義3個結構體類型的變量,用來存放3個學生的信息7.1結構體的引出structstudent{intnum;charname[10];charsex;

intage;

intscore;charinstitute[20]};7.2.1結構體的定義注意:定義了結構體類型,僅僅是定義了數據的組織形式,創立了一種數據類型,但并不會為這種結構體類型分配內存空間只有定義了結構體變量,才會為變量分配空間注意不要忘了分號成員表列struct

結構體類型名{數據類型成員名1;

數據類型成員名2;::

數據類型成員名n;}

;關鍵字用戶定義的標識符7.2結構體變量定義結構體變量的方法(1)先定義結構體類型,再定義變量

structstudent{charname[10];

intage;

ints1,s2;};

structstudentst1,st2;st1st2nameages1s2nameages1s2內存中結構體變量占有一片連續的存儲單元,其占用的字節數可用sizeof

運算符算出:

printf(“%d\n”,sizeof(structstudent));

printf(“%d\n”,sizeof(st1));結構體變量st1和st2各自都需要22個字節的存儲空間結構體類型定義結構體變量定義7.2結構體變量定義結構體變量的方法(2)定義結構體類型同時定義變量

structstudent{charname[10];

intage;

ints1,s2;}

st1,st2;(3)直接定義結構體變量

struct

{charname[10];

intage;

ints1,s2;}

st1,st2;注意:這里沒有結構體類型名這種方式有時使用并不方便因此不建議大家采用定義結構體變量7.2結構體變量例:

structdate{intyear;

intmonth;

intday;};

structstud{charname[10];

structdatebirthday;

ints1,s2;};結構體類型可以嵌套定義

或:structstud{charname[10];

structdate{intyear;

intmonth;

intday;}birthday;

ints1,s2;};7.2結構體變量7.2.2結構體變量的引用和初始化格式:

結構體變量名.

成員名structstudent{charname[10];

intage;

ints1,s2;};structstudentst1;st1.

name

=“Mary”;st1.age

=21;st1.

s1

=78;st1.

s2

=86;說明:一般情況下都是對結構體變量的成員進行賦值和輸入\輸出7.2結構體變量structdate{intyear;

intmonth;

intday;};structstud{charname[10];

intage;

structdatebirthday;

ints1,s2;};structstudst2;intage,year;=“John”;st2.age=20;st2.birthday.year=1980;st2.birthday.month=11;st2.birthday.day=23;st2.s1=89;st2.s2=95;age=24;year=2000;可以定義與結構體成員名相同名字的變量,它們之間不會發生混亂相同類型的結構體變量可以進行整體賦值

structdate{intyear;

intmonth;

intday;};structstud{charname[10];

intage;

structdatebirthday;

ints1,s2;};structstudst1,st2,st3;=“John”;st1.age=20;st1.birthday.year=1980;st1.birthday.month=11;st1.birthday.day=23;st1.s1=89;st1.s2=95;st2=st1;=“Mary”;st3.age=20;st3.birthday=st1.birthday;st3.s1=76;st3.s2=85;注意要正確賦值的條件是變量st1已經有了數據7.2結構體變量structstudent{charname[10];

intage;

ints1,s2;}

st1={“Mary”,21,78,86};structstud{charname[10];

structdatebirthday;

ints1,s2;};structstudst2={“John”,

1980,11,23

,89,95};structstudent{charname[10];

intage;

ints1,s2;};structstudentst1;

st1={“Mary”,21,78,86};初始化,正確這是賦值,錯誤C不允許這么做初始化,正確7.2.2結構體變量的引用和初始化結構體變量的輸入輸出

C語言不允許結構體變量整體進行輸入和輸出,

只能對結構體變量的成員進行輸入和輸出gets(

);scanf(“%d%d%d”,

&st1.birthday.year

,

&st1.birthday.month,

&st1.birthday.day);scanf(“%d%d%d”,

&st1.age,

&st1.s1,

&st1.s2);

puts();printf(“%4d”,st1.age);printf(“%d.%d.%d”,st1.birthday.year,st1.birthday.month,st1.birthday.day);printf(“%4d%4d\n”,st1.s1,st1.s2);7.2.2結構體變量的引用和初始化7.3結構體數組學號姓名性別年齡入學成績所屬學院0501李明男19610信息0502張莉女19595信息0503王濤男20580控制7.3.1結構體數組的定義一個結構體變量只能存放一個學生的信息,對于多個學生的信息,可以使用一個結構體數組來存放,結構體數組的每個元素是一個結構體類型的變量定義結構體數組的方法與定義普通數組的方法類似:結構體類型數組名[數組的長度];例:輸入30個學生的信息,并輸出#include<stdio.h>voidmain(){structstudent{intnum;charname[10];charsex;

intage;

intscore;charinstitute[20]};

structstudents[30];

inti;

for(i=0;i<30;i++){scanf(“%c%d%d%d”,&s[i].sex,&s[i].num,&s[i].age,&s[i].score);gets(s[i].name);gets(s[i].institute);}for(i=0;i<30;i++){printf(“%6d%10s%2c%3d”,s[i].num,s[i].name,s[i].sex,s[i].age);

printf(“%5d%20s\n”,s[i].score,s[i].institue);}}7.3結構體數組7.3.1結構體數組的定義1、定義結構體數組(1)先定義結構體類型再定義結構體數組

structstudent{charname[10];

intage;

ints1,s2;};structstudentst[6];(2)定義結構體類型的同時定義結構體數組

structstudent

{charname[10];

intage;

ints1,s2;}

st[6];(3)直接定義結構體數組

struct

{charname[10];

intage;

ints1,s2;}

st[6];不提倡使用該方法7.3.2結構體數組的初始化將每個數組元素的數據用花括號{}括起來structstudent{charname[10];

intage;

ints1,s2;};structstudentst[3]={

{“Mary”,21,78,86},

{“Alex”,20,90,80},

{“Mike”,19,75,68}

};Mary217886Alex209080Mike197568st[0]st[1]st[2]7.3結構體數組(2)數組元素之間可以整體賦值也可以將一個元素賦給一個相同類型的結構體變量structstudent

st[3]={

{“Mary”,21,78,86},{“Alex”,…}

};structstudent

x;st[2]=st[0];x=st[1];都是結構體變量的整體賦值形式7.3.3結構體數組的使用(1)引用某個數組元素的成員

例:puts(

st[0].name

);

printf(“%d,%d”,

st[1].age,st[1].s1

);(3)輸入和輸出操作只能對數組元素的成員進行7.3結構體數組分析:假設有3個候選人,共有100個人投票定義一個結構體數組,它有3個元素代表3個候選人,每個元素有2個成員,一個是候選人名字,一個是得票數(初始時為0)例:設計一個對候選人得票進行統計的程序候選人票數Mike0John0Alex0有100張選票,輸入選票上的名字,然后判斷是誰的名字,就將誰的票數加1,重復100次最后輸出結構體數組#include<stdio.h>#include<string.h>structperson{charname[10];

intcount;};voidmain(){structperson

cand[3]={{“Li”,0},{“Zhang”,0},{“Fun”,0}};

inti,j;charcname[20];for(i=0;i<100;i++){scanf(“%s”,cname);for(j=0;j<3;j++)if(strcmp(cname,cand[j].name)==0)cand[j].count++;

}for(i=0;i<3;i++)

printf(“%10s:%d\n”,cand[i].name,cand[i].count);}定義候選人的結構體類型對結構體數組進行初始化//輸入選票上的名字//若有100人投票,則循環100次//將選票上的名字依次和候選人的名字比較//選票上名字和某個候選人名字相同時,其票數加1例:按成績對學生信息進行從高到底的排序#include<stdio.h>#defineN30structstud{intn;//學生學號charname[10];//學生姓名

ints;//學生成績};voidinput(structstud

a[]){inti;for(i=0;i<N;i++)

scanf(“%d%s%d”,&a[i].n,a[i].name,&a[i].s);

}voidoutput(structstud

a[

]){inti;for(i=0;i<N;i++)

printf(“%4d%10s%4d”,a[i].n,a[i].name,a[i].s);

}

注意a[i].name前不加&,因name是數組名,因用%s,輸入時名字不能加空格voidsort(structstud

a[]

){inti,j;

structstud

temp;

for(i=0;i<N-1;i++)for(j=i+1;j<N;j++)

if(a[i].s<a[j].s)

{temp=a[i];a[i]=a[j];a[j]=temp;}}voidmain(){

structstud

st[N];

input(st);sort(st);output(st);}注意進行比較的是元素a[i]和a[j]的成績成員s,但進行交換的是元素a[i]和a[j]例:用冒泡排序法對6個數進行排序(從小到大)

9

7

2

5

4

1a[0]a[1]a[2]a[3]a[4]a[5]

7

2

5

4

1

92775471

2

5

4

1

7

94515

2

4

1

5

7

9

2

1

4

5

7

91412冒泡排序方法:依次比較相鄰的兩個數,將小數放前面,大數放后面.n個數排序需要進行n-1輪比較,從第1輪到第n-1輪,各輪的比較次數依次為:n-1次、n-2次…1次

9

7

2

5

4

19999972541初始狀態第1輪第2輪第3輪第4輪第5輪74.1一維數組冒泡排序#include<stdio.h>#defineN6voidmain(){int

a[N],i,j,t;

for(i=0;i<N;i++)

scanf(“%d”,&a[i]);

for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++)if(a[j]>a[j+1]){t=a[j];

a[j]=a[j+1];a[j+1]=t;

}for(i=0;i<N;i++)

printf(“%3d”,a[i]);}冒泡排序的改進方法

#include<stdio.h>voidmain(){inta[6],i,j,t,flag;for(i=0;i<6;i++)

scanf(“%d”,&a[i]);

i=0;

do{flag=0;for(j=0;j<5-i;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;flag=1;

}

i++;

}while(flag);for(i=0;i<6;i++)

printf(“%3d”,a[i]);}例:用選擇排序法對6個數進行排序(從小到大)

9

7

2

5

4

1a[0]a[1]a[2]a[3]a[4]a[5]選擇排序方法:第1輪比較時,用a[0]依次與a[1]到a[5]進行比較,如果a[0]較大則進行交換,第1輪結束后,a[0]中為最小數.以后各輪比較過程與第1論類似.

1

9

7

5

4

2

1

2

9

7

5

479574524

1

2

4

9

7

5

1

2

4

5

9

7795745

9

7

2

5

4

1729712初始狀態第1輪第2輪第3輪第4輪第5輪7957794.1一維數組選擇排序#include<stdio.h>#defineN6voidmain(){int

a[N],i,j,t;for(i=0;i<N;i++)

scanf(“%d”,&a[i]);

for(i=0;i<N-1;i++)for(j=i+1;j<N;j++)if(a[i]>a[j]){t=a[i];

a[i]=a[j];

a[j]=t;

}for(i=0;i<N;i++)

printf(“%3d”,a[i]);}選擇排序改進方法#include<stdio.h>voidmain(){inta[6],i,j,k,t;for(i=0;i<6;i++)

scanf(“%d”,&a[i]);for(i=0;i<5;i++){k=i;for(j=i+1;j<6;j++)if(a[k]>a[j])k=j;if(k!=i){t=a[i];a[i]=a[k];

a[k]=t;}//endif}//endforfor(i=0;i<6;i++)

printf(“%3d”,a[i]);}7.4結構體類型的指針變量

7.4.1指向結構體變量的指針

1.定義

structstudent

{charname[20];

intage;

ints1,s2;};

structstudent

stu,*p;

p=&stu;2.成員的引用格式(1)結構體變量名.成員名

gets(

);(*p).age

=21;p->s1

=87;p->s2

=90;(2)(*指針變量名).成員名

(*p).age(3)指針變量名->成員名

p

->s1typedef

structstudent{charname[20];

intage;

ints1,s2;}SD;

SDx,stu,*p;

p=&stu;成員的引用格式(1)結構體變量名.成員名例:scanf(“%s”,);scanf(“%d”,&x.age);x.s1=89;x.s2=78;gets();(*p).age=21;scanf(“%d”,&p->s1);p->s2=90;(2)(*指針變量名).成員名(*p).age(3)指針變量名->成員名p->s17.4結構體與指針說明:和成員運算符一樣,“->”為指向運算符,是運算優先級最高的運算符。由于成員運算符“.”的運算優先級高于運算符“*”,

因此(*p).成員名中()不能少。*p.成員名p=&stu.score;

不能用指向某個結構體變量的指針指向該結構體變量的某個成員。7.4.2指向結構體數組的指針1.定義structstudent

a[3],*p

;2.使用for(

p=a;p<a+3;p++

){gets(

p->name);

scanf(“%d%d%d”,&p->age,&p->s1,&p->s2);}

7.4結構體與指針例如:

struct

struct_name{charname[10];

intnum;floatscore;};/*定義結構體類型標識符*/

struct

struct_namestd[30],*p;900390趙明879002王建899001李紅結構體數組stdstd[0]std[1]std[2]p賦值語句p=std;/*p指向一個結構體數組std*//*指針變量p存放的是數組std的首地址*/引用:p->name;p->num;p->score;趙明909003879002王建899001李紅結構體數組stdstd[0]std[1]std[2]思考:賦值語句

p=std+1;和p++;分別代表指針p指向哪里?p->name;p->num;p->score;代表的信息發生了什么變化?pp注意:以下賦值語句都是錯誤的:p=&std[1].score;(不能指向數組元素的成員變量)p=&std;(數組名本身就代表該數組的首地址,因此不能使用地址運算符&)7.5.1結構體變量作為函數參數1.函數實參和形參都用結構體變量,參數之間為值傳遞,實參結構體變量各成員的值依次傳給形參結構體變量2.返回結構體類型值的函數定義格式:結構體類型名函數名(形參表){函數體;}

例:structstudentfunct(intx,floaty){函數體;}注意:結構體類型是已經定義好的7.5結構體與函數#include<stdio.h>#defineN5structstud{charname[10];

ints[3];

intsum,ave;};structstud

count(structstudx){intj;

x.sum=0;for(j=0;j<3;j++)

x.sum=x.sum+x.s[j];

x.ave=x.sum/3;

return(x);}例:求學生成績的總分和平均分(結構體變量作參數)//定義學生的結構體類型//計算學生三門課的總分//返回學生的全部信息//結構體變量作參數返回結構體類型的值voidmain(){structstuda[N];

intj;for(j=0;j<N;j++)

scanf(“%s%d%d%d”,a[j].name,&a[j].s[0],

&a[j].s[1],&a[j].s[2]);

for(j=0;j<N;j++)

a[j]=count(a[j]);

for(j=0;j<N;j++)printf(“%10s%4d%4d%4d%6d%4d\n”,a[j].name,a[j].s[0],a[j].s[1],a[j].s[2],a[j].sum,a[j].ave);}//函數調用,將a[j]的值傳給count函數的參數x,并將返回值賦給a[j]//輸入N個學生的信息//定義結構體數組a,存放N個學生的信息void

count(structstud*p){intj;p->sum=0;for(j=0;j<3;j++)p->sum=p->sum+p->s[j];p->ave=p->sum/3;}例:求學生成績的總分和平均分(指向結構體的指針作參數)#include<stdio.h>#defineN5structstud{charname[10];

ints[3];

intsum,ave;};//指向結構體的指針作參數返回結構體類型的值voidmain(){structstuda[N];

intj;for(j=0;j<N;j++)

scanf(“%s%d%d%d”,a[j].name,&a[j].s[0],

&a[j].s[1],&a[j].s[2]);

for(j=0;j<N;j++)

count(&a[j]);

for(j=0;j<N;j++)printf(“%10s%4d%4d%4d%6d%4d\n”,a[j].name,a[j].s[0],a[j].s[1],a[j].s[2],a[j].sum,a[j].ave);}voidmain(){structstuda[N],*q;

intj;

q=a;for(j=0;j<N;j++)

scanf(“%s%d%d%d”,q->name,&a[j].s[0],

&a[j].s[1],&a[j].s[2]);

for(j=0;q<a+N;q++)

count(q);

for(j=0;j<N;j++)printf(“%10s%4d%4d%4d%6d%4d\n”,a[j].name,a[j].s[0],a[j].s[1],a[j].s[2],a[j].sum,a[j].ave);}7.6鏈表鏈表:是可以動態地進行存儲分配的一種數據結構它是由一組動態數據鏈接而成的序列結點:鏈表中的每一個動態數據稱為一個結點表頭結點表尾結點NULL為空地址

表示鏈表到此結束2010142815709514281861570282NULL3中間結點一.、基本概念1.動態存儲分配:根據需要臨時分配內存單元用以存放數據,

當數據不用時可以隨時釋放內存單元2.鏈表:是可以動態地進行存儲分配的一種數據結構它是由一組動態數據鏈接而成的序列3.結點:鏈表中的每一個動態數據稱為一個結點4.結點類型:是一個包含指針項的結構體類型一般由兩部分組成:(1)數據成員:存放數據(2)指針成員:存放下一個結點的地址struct

sd{intnum;

intscore;

struct

sd*next;};

數據成員指針成員鏈表的基本概念2010142815709514281861570282NULL3鏈表的基本概念2010head2010142815709514281861570282NULL3鏈表的每個結點存放在內存中的不同位置,只有找到第1個結點,才能通過第1個結點的指針成員找到第2個結點…因此我們將第1個結點的地址存放在頭指針中頭指針鏈表的長度是不固定的,可以隨時添加結點,如果將一個結點添加到鏈表的尾部,則新結點成為表尾結點,它的指針成員必須賦為NULL,而原來的表尾結點則成為中間結點75NULL436923692靜態簡單鏈表#include<stdio.h>typedef

structstud{intnum,score;

structstud*next;}SD;head2010142815702010abc19514282861570382NULLp201014281570NULLvoidmain(){SD

a,b,c,*head,*p;

head=&a;a.num=1;a.score=95;a.next=&b;b.num=2;b.score=86;b.next=&c;c.num=3;c.score=82;c.next=NULL;

p=head;while(p!=NULL){printf(“%3d%4d\n”,p->num,p->score);

p=p->next;}}靜態簡單鏈表#include<stdio.h>typedef

structstud{intnum,score;

structstud*next;}SD;voidmain(){SDa,b,c,*head,*p;head=&a;

a.num=1;a.score=95;a.next=&b;

b.num=2;b.score=86;b.next=&c;

c.num=3;c.score=82;c.next=NULL;

while(head!=NULL){printf("%3d%4d\n",head->num,head->score);head=head->next;}}//也可以實現上一頁的功能動態鏈表的建立建立鏈表的方法表尾添加法:新結點作為表尾結點表首添加法:新結點作為表頭結點95NULL1201086NULL21428201082NULL3157095NULL1201086NULL2142882NULL31570head201014281570head20101428處理動態鏈表所需的函數(需用頭文件<stdlib.h>)1.malloc

函數原型:void*malloc(unsignedintsize)

作用:在內存中開辟一個長度為size的連續存儲空間,

并將此存儲空間的起始地址帶回注意:(1)函數返回值是指針,但該指針是指向void類型的,因此在使用時希望這個指針指向其他類型需要用強制類型轉換(2)如果內存缺少足夠大的空間進行分配,則malloc

函數返回值為“空指針”(即NULL)例:struct

sd*p;p=

(struct

sd*)

malloc(

sizeof(struct

sd)

);強制類型轉換結構體類型占用的字節長度2.free函數原型:voidfree(void*ptr)

作用:將指針變量ptr指向的存儲空間釋放注意:ptr的值不是任意的地址,必須是程序中執行malloc

函數所返回的地址(2)模型中ptr是void型,但調用free函數時,參數可能是其他類型,計算機系統會自動進行轉換

例:struct

sd*p;p=(struct

sd*)malloc(sizeof(struct

sd));free(p);p42004200動態鏈表的建立表尾添加法建立鏈表#include<stdio.h>#include<stdlib.h>typedef

structstudent{intnum;

intscore;

structstudent*next;}ST;#defineLENsizeof(ST)intn;定義ST,以后書寫簡單求出結構體類型占用的字節數全局量n表示結點的個數ST*creat(void){ST*p1,*p2,*head=NULL;n=0;

p1=(ST*)malloc(LEN);if(p1==NULL){printf("\nNoenoughmemory!\n");exit(0);}

scanf("%d%d",&p1->num,&p1->score);while(p1->num!=0){n=n+1;if(n==1)head=p1;elsep2->next=p1;p2=p1;

p1=(ST*)malloc(LEN);if(p1==NULL){printf("\nNoenoughmemory!\n");exit(0);}

scanf("%d%d",&p1->num,&p1->score);}p2->next=NULL;

free(p1);return(head);}//產生一個新結點//輸入新結點的數據成員//結點個數加1//讓指針p2指向p1所指向的結點//表尾結點的指針成員賦為空//釋放p1所指向的結點空間//p1指向新產生的結點//若n等于1,則p1當前所指向的是表頭結點由于head頭指針不變,所以讓下一個結點p2記錄表頭結點的地址,讓表頭結點去產生一個新結點,這樣再讓p2->next指向新結點,即可產生鏈接表尾添加法建立鏈表的過程演示ST*creat(void){ST*p1,*p2,

*head;head=NULL;n=0;p1=(ST*)malloc(LEN);

scanf("%d%d",&p1->num,&p1->score);while(p1->num!=0){n=n+1;if(n==1)head=p1;elsep2->next=p1;p2=p1;p1=(ST*)malloc(LEN);

scanf("%d%d",&p1->num,&p1->score);}p2->next=NULL;free(p1);return(head);}head201014281570NULLp1p23264201020101951428n201014282863820014281570NULL1570157032640123動態鏈表的遍歷(輸出)輸出鏈表voidlist(ST*head){ST*p;

p=head;while(p!=NULL){printf(“%d,%d\n”,p->num,p->score);

p=p->next;

}}head201014281570201019514282861570382NULLp201014281570NULL輸出:1,952,863,82voidmain(){ST*h=NULL;

h=creat();list(h);}951428120108615702142882NULL315702010head鏈表的刪除結點操作刪除表頭結點讓頭指針指向鏈表的第2個結點1428step1:讓指針變量p指向要刪除的結點即表頭結點step2:重新給頭指針賦值,使它指向第2個結點head=p->next;step3:釋放刪除的結點空間free(p);p=head;2010p應為要釋放刪除的結點,所以必須在知道此結點的地址的情況下,才能進行空間釋放,所以讓p記錄此結點的地址。951428120108615702142882NULL315702010head鏈表的刪除結點操作刪除表尾結點將鏈表的倒數第2個結點的指針成員賦為NULLstep1:讓指針變量p指向要刪除的結點即表尾結點

讓指針變量q指向要刪除結點的前一個結點1570p1428qstep2:將刪除結點的前驅結點的指針成員賦空值step3:釋放刪除的結點空間free(p);q->next=NULL;NULL951428120108615702142882NULL315702010head鏈表的刪除結點操作刪除中間結點step1:讓p指向要刪除的結點,

讓q指向要刪除結點的前驅結點1428p2010qstep2:前驅結點的指針成員賦為要刪除結點的指針成員值step3:釋放刪除的結點空間free(p);q->next=p->next;讓要刪除結點的前驅結點指向要刪除結點的后繼結點1570ST*del(ST*head,intnum){ST*p,*q=NULL;p=head;

while((num!=p->num)&&(p->next!=NULL)){q=p;p=p->next;}if(num==p->num){if(p==head)head=p->next;elseq->next=p->next;

free(p);

n=n-1;

printf(“deleted!\n”);}elseprintf(“cannotdelete!\n”);

return(head);}typedef

structstudent{intnum;

intscore;

structstudent*next;}ST;鏈表的刪除結點操作刪除結點函數令p指向要刪除的結點,q指向其前驅結點(方法)//刪除結點為表頭結點//刪除結點為表尾結點或中間結點//釋放已刪除的結點空間//鏈表的結點個數減1//返回鏈表的頭指針要求:刪除與num相等的結點ST*p,*q=NULL;

p=head;while((num!=p->num)&&(p->next!=NULL)){q=p;p=p->next;}951428120108615702142882NULL315702010head2010pNULLq設num=32010142814281570讓p指向要刪除的結點,讓q指向其前驅結點鏈表的刪除結點操作鏈表的插入結點操作插入的結點作表頭結點951428220108615705142882NULL815702010head75121062106p02010p12010讓p0指向新結點即要插入的結點,讓p1指向插入位置上的結點即表頭結點head=p0;p0->next=p1;2106插入的結點作表尾結點9693652951428220108615705142882NULL815702010head讓p0指向新結點即要插入的結點,讓p1指向插入位置上的結點即表尾結點3652p01570p1NULL3652鏈表的插入結點操作p1->next=p0;p0->next=NULL;插入的結點作中間結點9262374951428220108615705142882NULL815702010head鏈表的插入結點操作讓p0指向新結點即要插入的結點,讓p1指向插入位置上的結點,p2指向p1的前驅結點2374p01570p11428p223741570p2->next=p0;p0->next=p1;鏈表的插入結點操作插入結點函數ST*insert(ST*head){ST*p0,*p1,*p2;p1=head;p0=(ST*)malloc(LEN);

scanf(“%d%d”,&p0->num,&p0->score);if(head==NULL){head=p0;p0->next=NULL;}else{while((p0->num>p1->num)&&(p1->next!=NULL)){p2=p1;p1=p1->next;}if(p0->num<=p1->num){if(head==p1)head=p0;elsep2->next=p0;p0->next=p1;}else{p1->next=p0;p0->next=NULL;}}n++;return(head);}//如果是空鏈表,則新結點是鏈表的表頭結點//找到要插入結點的位置//插入結點作表頭結點//插入結點作中間結點//插入結點作表尾結點//鏈表的結點個數加1鏈表的插入結點操作(1)插入鏈表的第一個結點ST*insert(ST*head){ST*p0,*p1,*p2;p1=head;p0=(ST*)malloc(LEN);

scanf(“%d%d”,&p0->num,&p0->score);

if(head==NULL){head=p0;p0->next=NULL;}

else{…}

n++;return(head);}headNULL1428p1p2p03861428NULL1428NULLn0

1鏈表的插入結點操作ST*insert(ST*head){ST*p0,*p1,*p2;p1=head;p0=(ST*)malloc(LEN);

scanf(“%d%d”,&p0->num,&p0->score);

if(head==NULL){…}

else{while((p0->num>p1->num)&&(p1->next!=NULL))

{…}

if(p0->num<=p1->num){if(head==p1)head=p0;

else…

p0->next=p1;}

else{…}}n++;return(head);}1428head1428386NULLn12p1p2p0

201020101428195(2)插入結點作表頭結點14282010鏈表的插入結點操作ST*insert(ST*head){ST*p0,*p1,*p2;p1=head;p0=(ST*)malloc(LEN);

scanf(“%d%d”,&p0->num,&p0->score);

if(head==NULL){…}else{while((p0->num>p1->num)&&(p1->next!=NULL)){p2=p1;p1=p1->next;}

if(p0->num<=p1->num){…}

else{p1->next=p0;p0->next=NULL;}}n++;return(head);}1570(3)插入結點作表尾結點20101428head20101951428386NULLp2p0n2p1582NULL201020101428315707.8類型定義符typedef的用法

當用戶定義一種結構體類型后,每次都需要用“struct

結構體類型名”來定義相應變量,稍顯麻煩。C語言不僅提供了豐富的數據類型,而且還允許由用戶自己定義類型說明符,也就是說允許由用戶為數據類型取“別名”。類型定義符ty

溫馨提示

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

評論

0/150

提交評論