预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共94页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第9章结构体与共用体第9章结构体与共用体一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。 一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。 如何描述这些类型不同的相关数据?struct结构体名 {数据类型1成员名1; 数据类型2成员名2; …… 数据类型n成员名n; };例如图书类型的定义: structbookcard {charnum[10];/*图书分类编号是字符数组类型*/ charname[30];/*书名是字符数组类型*/ charauthor[30];/*作者是字符数组类型*/ charpublisher[60];/*出版社是字符数组类型*/ floatprice;/*价格是单精度实型*/ intn;/*库存量是整型*/ };9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体9.1结构体⑴动态分配存储区函数malloc() 函数原型:void*malloc(unsignedsize); 调用格式:malloc(size) 功能:在内存分配一个size字节的存储区。调用结果为新分配的存储区的首地址,是一个void类型指针。若分配失败,则返回NULL(即0)。【例9.11】调用malloc函数分配所需存储单元。 #include<stdlib.h> main() {structst {intn; structst*next; }*p; p=(structst*)malloc(sizeof(structst)); p->n=5;p->next=NULL; printf("p->n=%d\tp->next=%x\n",p->n,p->next); }⑵动态分配存储区函数calloc() 函数原型: void*calloc(unsignedintn,unsignedintsize); 调用格式:calloc(n,size) 功能:在内存分配一个n倍size字节的存储区。调用结果为新分配的存储区的首地址,是一个void类型指针。若分配失败,则返回NULL(即0)。【例9.12】调用calloc函数分配所需存储单元。 #include<stdlib.h> main() {inti,*ip; ip=(int*)calloc(10,2); for(i=0;i<10;i++) scanf("%d",ip+i); for(i=0;i<10;i++) printf("%d",*(ip+i)); printf("\n"); }⑶释放动态分配存储区函数free() 函数原型:voidfree(void*p);9.1结构体q#include<stdlib.h> #include<string.h> #defineNEW(structnode*)malloc(sizeof(structnode)) structnode {charname[20],tel[9]; structnode*next; };9.1结构体【例9.14】输出学生电话簿链表函数。 在链表中,如果要删除第i个结点,一般是将第(i-1)个结点直接与第(i+1)个结点相连接,然后再释放第i个结点的存储单元。【例9.15】删除学生电话簿链表中指定学生的信息。【例9.15】删除学生电话簿链表中指定学生的信息。【例9.15】删除学生电话簿链表中指定学生的信息。【例9.15】删除学生电话簿链表中指定学生的信息。structnode*delnode(structnode*head,char*x) {structnode*p,*q; staticstructnode*h; if(head==NULL) {printf("Thisisaemptylist.");/*空链表情况*/ returnhead; } p=head; while(strcmp(x,p->name)!=0&&p->next!=NULL) {q=p;p=p->next;}/*q指针尾随p指针向表尾移动*/if(strcmp(x,p->name)==0) {if(p==head) head=p->next;/*删除头结点*/ else q->next=p->next;/*删除中间或尾结点*/ free(p);/*释放被删除的结点*/ } else printf("Notfound.");/*未找到指定的结点*/ h=head; returnh; } 将一个新结点插入到链表中,首先要寻找插入的位置。如果要求