C語言之結構體巢狀一級指標和二級指標
阿新 • • 發佈:2019-02-14
指標是C語言的精華,也是c中最難的部分;為了鍛鍊和提高自己對指標的理解,特在結構體中巢狀一級指標和二級指標來加深對。
#include<stdio.h>
#include <string.h>
#include<stdlib.h>
#define false 0
#define true 1
//結構體型別,每個導師有三個學生
typedef struct Tea
{
char *tName; //導師名字,需要動態分配空間char *====>char
char **stu; //三個學生,需要動態分配空間,堆區陣列
int age;
}Teacher;
//在createTeacher中分配空間
//n1 =3; //導師個數
//n2 = 3 //學生
int createTeacher(Teacher **p, int n1, int n2)
{
int len=0;
int i,j,k; //分配3個Student資訊
*p = (Teacher*)malloc (sizeof(Teacher)*3);
for (i=0;i<n1;i++) //分配3個導師的地址空間
{
(*p)[i].tName=(char *)malloc (sizeof(char)*20);
if ((*p)[i].tName == NULL)
{
return false;
}
}
//(*p)->stu=(char **)malloc (sizeof(char*)*3);
for (j=0;j<n2;j++)
{
(*p)[j].stu=(char **)malloc (sizeof(char)*3);
if ((*p)[j].stu == NULL)
{
return false;
}
for (k=0;k<3;k++)
{
(*p)[j].stu[k]=(char *)malloc (sizeof(char)*20);
if ((*p)[j].stu[k] == NULL)
{
return false;
}
}
}
return true;
}
//給成員賦值
void initTeacher(Teacher *p, int n1, int n2)
{
int i,j,k=0; //
if (p == NULL)
{
printf ("error\n");
}
//n1 =3; //導師個數
//n2 = 3 //學生
puts ("-----導師賦值------");
for (i=0;i<n1;i++)
{
char *buf[]={"王教授","陸教授","田導師"};
p[i].age=22+i;
//printf ("%d",p[i].age);
strcpy (p[i].tName,buf[i]);
// printf ("%s",p[i].tName);
for (j=0;j<n2;j++)
{
char *arr[]={"小黎","小田","小張","小王","小胡","小范",
"小楊","小石","小柯"};
strcpy (p[i].stu[j],arr[k]);
++k;
// printf ("%s\n",p[i].stu[j]);
}
}
}
//列印結構體成員資訊
void printTeacher(Teacher *p, int n1, int n2)
{
int i,j;
if (p == NULL)
{
printf ("error\n");
}
for (i=0;i<n1;i++)
{
printf ("\t\t%s\n",p[i].tName); //導師
for (j=0;j<n2;j++)
{
printf ("\t%s",p[i].stu[j]);
}
putchar('\n');
printf ("\t\t%d\n\n",p[i].age);
}
}
//根據導師名字排序, 降序
void sortTeacher(Teacher *p, int n)
{
Teacher t1;
int i,j;
if (p==NULL)
{
printf ("error\n");
}
for (i=0;i<n-1;i++)
{
for (j=i+1;j<n;j++)
{
if ((strcmp (p[i].tName,p[j].tName))>0)
{
t1=p[i];
p[i]=p[j];
p[j]=t1;
}
}
}
}
//釋放空間,在函式內部把p賦值為NULL
void freeTeacher(Teacher **p, int n1, int n2)
{
int i,j;
if (p == NULL)
{
printf ("Empty\n");
}
else
{
for (i=0;i<n1;i++)
{
for (j=0;j<n2;j++)
{
if (p[i]->stu[j]!=NULL)
{
free (p[i]->stu[i]);
p[i]->stu[j]=NULL;
}
}
if (p[i]->stu!= NULL)
{
free (p[i]->stu);
p[i]->stu=NULL;
}
}
}
}
int main(void)
{
int ret = 0;
int n1 = 3; //導師個數
int n2 = 3; //學生
Teacher *p = NULL;
ret = createTeacher(&p, n1, n2);
if (ret == false)
{
printf("createTeacher err:%d\n", ret);
exit (EXIT_FAILURE);
}
initTeacher(p, n1, n2); //給成員賦值
//列印成員,排序前
printf("排序前:\n");
printTeacher(p, n1, n2);
//根據導師名字排序, 降序
sortTeacher(p, n1);
//列印成員,排序後
printf("\n排序後:\n");
printTeacher(p, n1, n2);
//釋放空間,在函式內部把p賦值為NULL
//freeTeacher(&p, n1, n2);
system("pause");
return 0;
}
記憶體四區圖: