#include<stdio.h> /*实现记录学校人员信息,包括学生和老师,其中信息包含身份、姓名、性别、职务/班级*/
#include<stdlib.h>
struct Position /*结构体变量定义班级或职务*/
{
int iClass;
char cStaff[];
};
union Membership /*共用体变量定义成员信息*/
{
char cStatus[];
char cName[];
int iNumber;
char cSex[];
int iGo; /*作为判断是否继续的依据*/
struct Position Text; /*共用体中引用结构体*/
union Membership* pNext; /*指向下一个结点指针*/
};
int iCount; /*定义全局链表长度*/
union Membership* Create()
{
union Membership *pHead=NULL; /*头指针初始化为空*/
union Membership *pNew, *pEnd;
iCount=0; /*链表长度初始化为0*/
pNew=pEnd=(union Membership*)malloc(sizeof(union Membership)); /*创建动态链表*/
printf("请输入学校人员信息:\n"); /*提示信息*/
printf("身份 姓名 编号 性别 职务 班级 是否继续\n");
scanf("%s",&pNew->cStatus); /*输入信息*/
scanf("%s",&pNew->cName);
scanf("%d",&pNew->iNumber);
scanf("%s",&pNew->cSex);
scanf("%d",&pNew->Text.iClass);
scanf("%s",&pNew->Text.cStaff);
scanf("%d",&pNew->iGo);
while(&pNew->iGo!=0); /*判断语句是否进行*/
{
iCount++;
if(iCount==1)
{
pNew->pNext=pHead; /*使指向为空*/
pEnd=pNew; /*跟踪新加入的结点*/
pHead=pNew; /*头指针指向首结点*/
}
else
{
pNew->pNext=NULL; /*新结点的指针为空*/
pEnd->pNext=pNew; /*原来的尾结点指向新结点*/
pEnd=pNew; /*pEnd指向新结点*/
}
pNew=(union Membership*)malloc(sizeof(union Membership)); /*再次分配节点内存空间*/
scanf("%s",&pNew->cStatus);
scanf("%s",&pNew->cName);
scanf("%d",&pNew->iNumber);
scanf("%s",&pNew->cSex);
scanf("%d",&pNew->Text.iClass);
scanf("%s",&pNew->Text.cStaff);
scanf("%d",&pNew->iGo);
}
free(pNew); /*释放无用空间*/
return pHead;
}
void Print(union Membership* pHead)
{
union Membership *pTemp; /*定义临时指针*/
int iIndex=1; /*定义结点序号*/
printf("数据库中共有%d个人\n",iCount);
printf("\n");
pTemp=pHead; /*指针得到首结点地址*/
while(pTemp!=NULL)
{
printf("第%d个人员信息如下:\n");
printf("身份:%s\n",pTemp->cStatus);
printf("姓名:%s\n",pTemp->cName);
printf("编号:%d\n",pTemp->iNumber);
printf("性别:%s\n",pTemp->cSex);
printf("班级:%d",pTemp->Text.iClass);
printf("职务:%s\n",pTemp->Text.cStaff);
printf("\n");
pTemp=pTemp->pNext; /*移动临时指针到下一个结点*/
iIndex++;
}
}
int main()
{
union Membership *pHead; /*定义头结点*/
pHead=Create(); /*创建结点*/
Print(pHead); /*输出链表*/
return 0; /*程序结束*/
}
https://blog.csdn.net/teamossp/article/details/8896975