共用体用同一个空间来实现储存不同类型的数据,与结构体不同,结构体的大小是整个结构体成员的总和,而共用体的大小是该共用体的成员中占内存最大的决定。
比如:用一个链表来储存学生和老师的信息,包括号码、姓名、职责(学生还是老师)、类别(几班或者职位)。
这个类别中班级是整数,而职位是字符串,此时可用共用体来表示,需要储存整数就用整型,需要字符串就char型。示例代码:
#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Person) struct Person { int num; char name[20]; char job; union ts { int clas; char position[10]; }category; struct Person*next; }; int n; struct Person *creat() { struct Person *head; struct Person *p1; struct Person *p2; p2=p1=(struct Person * )malloc(LEN); printf("please input your date:\n"); scanf("%d %s %c",&p1->num,&p1->name,&p1->job); if(p1->job=='t')scanf("%s",&p1->category.position); else if(p1->job=='s')scanf("%d",&p1->category.clas); else printf("Input error!\n"); head=NULL; while(p1->num != 0) { n=n+1; if(n==1)head=p1; else p2->next=p1; p2=p1; p1=(struct Person * )malloc(LEN); scanf("%d %s %c",&p1->num,&p1->name,&p1->job); if(p1->job=='t')scanf("%s",&p1->category.position); else if(p1->job=='s')scanf("%d",&p1->category.clas); else printf("Input error!\n"); //printf("\nget one\n"); } p2->next=NULL; return (head); } void print(struct Person *head) { struct Person *p; printf("\n NO.\tname\tjob\tclas/position\n"); p=head; if(head != NULL) do { if(p->job=='s') printf("%d\t%s\t%c\t%d\n",p->num,p->name,p->job,p->category.clas); else printf("%d\t%s\t%c\t%s\n",p->num,p->name,p->job,p->category.position); p=p->next; }while(p->next!=NULL); } int main() { struct Person *head; head=creat(); print(head); return 0; }
程序运行截图: