单链表示例
案例1:创建并访问一个带头结点的、存储整型数据的单链表,数据从键盘输入,0为输入结束标志。
#include <stdio.h>
#include <stdlib.h>
struct linkRec{
int data;
struct linkRec *next;
};
int main()
{
int x;
struct linkRec *head,*p,*rear;
head = rear = (struct linkRec *)malloc(sizeof(struct linkRec)); //创建空链表
//创建链表的其它结点
while(1){
scanf("%d",&x);
if(x==0) break;
p=(struct linkRec *)malloc(sizeof(struct linkRec)); //申请一个新结点
p->data=x;
rear->next=p;
rear=p;
}
rear->next=NULL;
//读链表
printf("链表的内容为:\n");
p=head->next;
while(p!=NULL){
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
return(0);
}
案例2:约瑟夫环问题。
#include <stdio.h>
#include <stdlib.h>
struct node{
int data;
struct node *next;
};
typedef struct node NODE;
int main()
{
NODE *head,*p,*q;
int n,i;
printf("Please input n:");
scanf("%d",&n);
//建立链表
head = p=(NODE *)malloc(sizeof(NODE));
p->data=0;
for(i=1;i<n;i++){
q=(NODE *)malloc(sizeof(NODE));
q->data=i;
p->next=q;
p=q;
}
p->next=head;
//删除过程
q=head;
while(q->next!=q){
p=q->next;
q=p->next;
p->next = q->next;
printf("%d\t",q->data);
free(q);
q=p->next;
}
//打印结果
printf("\n最后剩下:%d\n",q->data);
return(0);
}
共用体
共用体的概念
C语言中有一个看上去与结构体非常类似的类型,称为共用体或联合体。
定义共用体类型时,用关键字union代替关键字struct,如下所示:
struct CharAndInt{
int data;
char s[4];
};
//----------***----------
union CharOInt{
int data;
char s[4];
};
两者看上去很类似,但本质完全不同。
结构体表示该类型的变量由一组分量组成,每个结构体类型的变量包含所有的分量。
共用体表示所有分量共享同一块空间。
案例:测试CharAndInt和CharOrInt占用的空间量。
#include <stdio.h>
#include <stdlib.h>
struct CharAndInt{
int data;
char s[5];
};
union CharOrInt{
int data;
char s[5];
};
int main()
{
printf("CharAndInt占用%d个字节\n",sizeof(struct CharAndInt));
printf("CharOrInt占用%d个字节\n",sizeof(union CharOrInt));
return(0);
}
数据怎么来的呢?
CharAndInt:结构体CharAndInt
中包含一个int
类型的数据和一个长度为5的char
类型的数组,因此它的大小为 4+5=9
个字节。但是由于内存对齐的原因,编译器会在结构体中添加一些填充字节,以保证结构体中每个成员的地址都是对齐的。在这个例子中,int
类型的数据需要4个字节,而char
类型的数组需要1个字节,因此编译器会在char
类型的数组后面添加3个填充字节,使得结构体的大小为 12
个字节。
1+3=4
4+5+3=12
5+3=8
共用体类型变量的定义及初始化
union CharOrInt u1,u2,*p;
C语言规定,初值的类型必须是第一个成员的类型。如:
union CharOrInt u1={97},u2={98};
共用体变量的使用
共用体变量的使用就是引用它的分量,引用方法与结构体类型的变量相同,也是用点运算符。如:
u1.data=100;
u2.data='a';
共用体也可以用指针访问,用“->”运算符。
共用体变量的基本操作
案例1:定义一个共用体类型CharOrInt及一个该类型的变量。输出该变量的占用的空间,检查变量及各分量的地址及值,以及测试共用体作为函数的参数。
#include <stdio.h>
#include <string.h>
union CharOrInt{
int data;
char s[4];
};
int f(union CharOrInt u){
return u.data;
}
int main()
{
union CharOrInt u1={97},*u2=&u1;
printf("CharOrInt占用的空间是%d个字节\n",sizeof(u1));
printf("u1地址是%d,u1.data地址是%d,u1.data地址是%d\t",&u1,&u1.data,u1.s);
printf("\n%d\n",u2->data);
printf("\n%d\n",f(u1));
strcpy(u1.s,"abc");
printf("\n%s\n",u2->s);
return(0);
}
案例2:设计一个程序管理教工和学生的信息。
教工信息包括:工号,姓名,职业,部门。
学生信息包括:学号,姓名,类别,班级。
需要把教工和学生信息放入同一张表中。
信息表如下所示:
学校成员信息表
如何将它们合二为一?共用体提供了一个很好的解决方案,可以将这两个信息组成一个共用体。程序实现如下所示:
#include <stdio.h>
#define MAX 10
int main()
{
struct People{
int no;
char name[10];
char type;
union Position{
int Class;
char dept[10];
}position;
}people[MAX];
int i;
for(i=0;i<MAX;i++){
printf("请输入%d个人的工号/学号:",i+1);
scanf("%d",&people[i].no);
getchar();
printf("请输入%d个人的姓名:",i+1);
gets(people[i].name);
printf("请输入%d个人的类型:",i+1);
people[i].type=getchar();
getchar();
switch(people[i].type){
case 'T':
case 'A':
case 'S':
printf("请输入%d个人的部门:",i+1);
gets(people[i].position.dept);
break;
default:
printf("请输入%d个人的班级:",i+1);
scanf("%d",&people[i].position.Class);
}
}
printf("学号/工号 姓名 类别 班级/部门\n");
for(i=0;i<MAX;i++){
printf("%-11d%-14s%",people[i].no,people[i].name);
switch(people[i].type){
case 'T': printf("%-10s","教师"); break;
case 'A': printf("%-10s","机关人员"); break;
case 'S': printf("%-10s","后勤人员"); break;
case 'P': printf("%-10s","博士生"); break;
case 'G': printf("%-10s","硕士生"); break;
default: printf("%-10s","本科生");
}
switch(people[i].type){
case 'T':
case 'S':
printf("%-10s\n",people[i].position.dept);
break;
default:
printf("%-10d\n",people[i].position.Class);
}
}
return(0);
}
程序的某次执行的结果为:
案例3:测试整型数每个字节的值。
#include <stdio.h>
int main()
{
union CharOrInt{
int data;
unsigned char s[4];
};
union CharOrInt u1={65535}, u2={131071};
printf("%x %x %x %x\n",u1.s[3],u1.s[2],u1.s[1],u1.s[0]);
printf("%x %x %x %x\n",u2.s[3],u2.s[2],u2.s[1],u2.s[0]);
return(0);
}
结构体中关于共用体的知识点总结到此就结束了,希望我的文章对你有帮助!
标签:struct,int,u1,C语言,printf,next,data,结构 From: https://blog.51cto.com/u_16174658/8549947