一.结构体

由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的。

1.1如何声明结构体呢?

struct 结构体名  //结构体名字用作结构体类型的标志

{成员列表};

比如:

1 structstudent2 {3   intnum;  //24   char name[20];  //205   charsex;  //16   intage;  //27   floatscore;  //48   char addr[30];  //309 };

注意:声明只是指定了一个结构体类型,它相当于一个模型,但其中并无具体数据,系统对之也不分配实际内存单元。为了能在程序中使用结构类型的数据,应当定义结构体类型的变量....

1.2如何定义结构体变量呢?

方法一:可以在声明的同时定义。在第9行分号前面添加 “student1,student2” 即可表明,student1和student2就是student结构体的两个变量。在定义了结构体变量后,系统会为之自动分配内存,上述就分配了59个字节。

一般形式为:

struct 结构体名

{

成员表列

}变量名表列;

方法二:直接定义结构类型变量。此形式不出现结构体名!

一般形式为:

struct

{

成员表列

}变量名表列;

此处特别强调:类型和变量的区别,变量能进行赋值、存取、和运算,但是类型不行。在编译时,类型是不分配空间的,只能对变量分配空间。所以,对结构体里面的各个的成员可都以单元使用,因为它是有内存的。那么怎么去用结构体里面的成员呢?接下来就告诉你!

方法3:在已经声明/定义了结构体类型时,利用了类型名称定义结构体变量!

struct student student1;  //student1是变量名;struct student 是变量类型名称

1.3如何使用结构体成员变量

1 #include

2 structstudent3 {4   long intnum;5   char name[20];6   charsex;7   char addr[30];8 }a = {89031, "Li Lin", 'M', "123 Beijing Road"};    //定义了结构体变量,并给予赋值9 voidmain()10 {11   printf("NO. : %d\nname: %s\nsex: %c\naddress: %s\n", a.num, a.name, a.sex, a.addr) //输出结构体成员的值12 }

但是需要注意以下几点:

(1)不能将一个结构体变量作为一个整体进行输入和输出,只能对结构体变量在的各个成员分别进行输入输出!

引用结构体变量中成员方式:  结构体变量.成员名称

若p是指向 结构体类型(student) 的指针,也可以这样表示成员      (*)p.age    也可以p->age

故,以上三种表达成员的方式均是等价的!

附:->是指向运算符

p -> n 得到 p 指向的结构体变量中的成员 n 的值

p -> n ++ 得到 p 指向的结构体变量中的成员 n 的值,用完值后使它加1

++p -> n 得到 p 指向的结构体变量中的成员 n 的值使之加 1 (先加)

(2)如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员,只能对最低级的成员进行运算、赋值!

结构体变量.结构体中的结构体名称.成员名称

附: .是优先级最高的运算符

1.4结构体数组

定义方法:(1)struct student stu[3];

(2)在结构体最后,分号之前加入数组,如stu[4]

(3)

-----类似定义结构体变量,只不过是变量是一个数组形式存在而已

赋值方式:(举个例子)

1 structstudent2 {3     intmum;4     char name[20];5     charsex;6     intag;7     floatscore;8     char addr[30];9   }stu[3] = {{10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"},10        {10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"},11        {10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"}};

定义数组 stu 时,元素个数可以不指定,即写成以下形式:

stu[] = {{...},{...},{...}};

综上,举一个例子:

1 #include

2 #include

3 #include

4

5 structperson6 {7   char name[20];8   intcount;9 }leader[3] = {{"Li", 0},10        {"Zhang", 0},11        {"Fun", 0}};12

13 voidmain()14 {15   inti, j;16   char leader_name[20];17   for(i = 1; i<= 10;i++)18 {19     scanf("%s", leader_name);20     for(j=0;j<3;j++)21       if(strcmp(leader_name, leader[j].name) == 0)22         leader[j].count ++;23 }24   printf("\n");25   for(i=0;i<3;i++)26   printf("%5s: %d\n", leader[i].name, leader[i].count);27   system("pause");28 }

二、typedef  struct的用法

(此部分转载自http://www.cnblogs.com/st-moon/p/5588321.html)

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

第一种  上面第二种用法前面直接加typedef

typedef struct student{

char name[20];

int age;

char class;

}student_1;

这语句实际上完成两个操作:

1) 定义一个新的结构类型

struct student{

char name[20];

int age;

char class;

};

2) typedef为这个新的结构起了一个名字,叫student_1。

typedef struct student student_1; (对比typedef int student_1来进行理解)

因此,student_1实际上相当于struct student,这样定义一个变量的时候,既可以用struct student aaa,也可以用student_1 aaa。student_1成了一个数据类型。

如果有逗号,比如

typedef struct student{

char name[20];

int age;

char class;

}student_1,student_2;

可以先理解成

struct student{

char name[20];

int age;

char class;

}student_1;

struct student{

char name[20];

int age;

char class;

}student_2;

这样再加上typedef,同上分析,也就是说struct student有两个别名,分别是student_1和student_2,都可以代替struct student定义变量。也就是说有三种用法,struct student aaa;student_1 aaa;student_2 aaa都是等价的。

第二种  上面第三种用法前面直接加typedef

typedef struct {

char name[20];

int age;

char class;

}student_1;

根据唯一性,即定义变量的时候只能是student_1 aaa;

三、链表

是一种动态的存储分配结构。

1   structstudent2 {3     intnum;4     floatscore;5     struct student *next;6   };

链表含有一个头指针变量,它存放一个地址,该地址指向一个元素,链表中每一个元素称为结点。

结点包含两部分:用户需要用的实际数据、下个结点的地址!存放下一个地址的叫作 头指针 (head).....当然,最后表尾的地址是NULL(空地址)

以下实现建立和输出一个简单的链表:

#include #include

#define NULL 0

structstudent

{longnum;floatscore;struct student *next;

};voidmain()

{struct student a, b, c, *head, *p;

a.num= 99101; a.score = 89.5;

b.num= 99103; b.score = 90;

c.num= 99107; c.score = 85;//对结点的 num 和 score 成员赋值

head = &a;//将结点 a 的起始地址赋给头指针 head

a.next = &b;//将结点 b 的起始地址赋给 a 结点的 next 成员

b.next = &c;

c.next= NULL;//c 结点的 next 成员不存放其他结点地址

p = head;//使 p 指针指向 a 结点

do{

printf("%ld %5.1f\n", p->num, p->score);//输出 p 指向的结点的数据

p = p->next;//使 p 指向下一结点

}while(p != NULL);//输出完 c 结点后 p 的值为 NULL

system("pause");

}

运行结果99101 89.5

99103 90.0

99107 85.0

3.1动态链表所需的函数

(1)malloc 函数

void *malloc(unsigned int size);

作用是在内存的动态存储区中分配一个长度为 size 的连接空间。些函数的值(即返回值)是一个指向分配空间起始地址的指针(基类型为 void)。如果些函数未能成功地执行(例如内存空间不足)则返回空指针 NULL。

(2)calloc 函数

void *calloc(unsigned n, unsigned size);

其作用是在内存的动态区存储中分配 n 个长度为 size 的连续空间。函数返回一个指向分配空间起始地址的指针,如果分配不成功,返回 NULL。

用 calloc 函数可以为一维数组开辟动态存储空间, n 为数组元素个数,每个元素长度为 size。

(3)free 函数

void free(void *p);

其作用是释放由 p 指向的内存区,使这部分内存区能被其它变量使用, p 是最后一次调用 calloc 或 malloc 函数时返回的值。free 函数无返回值。

请注意:以前的C版本提供的 malloc 和 calloc 函数得到的是指向字符型数据的指针。ANSI C 提供的 malloc 和 calloc 函数规定为 void * 类型。

例:动态表的建立

1 #include

2 #include

3

4 #define NULL 0

5 #define LEN sizeof(struct student)

6

7 structstudent      //声明结构体8 {9   longnum;10   floatscore;11   struct student *next;12 };13

14 struct student *create()  //创建结构体,create是指向这个结构体的指针15 {16   struct student *p1, *p2, *head;17   intnum;18   floatscore;19   int n = 0;20

21   head =NULL;22

23   p1 = p2 = (struct student *)malloc(LEN);24

25   printf("please input num and score.\n");26   scanf("%d,%f", &p1->num, &p1->score);27

28   while(p1->num != 0)29 {

31     n ++;32     if(n == 1)33       head =p1;34     else

35       p2->next =p1;36     p2 =p1;37     p1 = (struct student *)malloc(sizeof(structstudent));38     printf("please input num and score.\n");39     scanf("%d,%f", &p1->num, &p1->score);40 }41   p2->next =NULL;42   returnhead;43 }44

45 void printlist(struct student *head)46 {47   struct student *p;48   p =head;49

50   if(head !=NULL)51 {52     do

53 {54       printf("num=%d score=%f\n", p->num, p->score);55       p = p->next;56

57     }while(p !=NULL);58 }59 }60

61 voidmain()62 {63   struct student *head;64   head =create();65 printlist(head);66   system("pause");67 }68

69 以下是对链表的各种操作70

71 //打印链表

73 void printlist(struct student *head)74 {75 struct student *p;76 p =head;77

78 if(head !=NULL)79 {80 do

81 {82 printf("num=%d score=%5.2f\n", p->num, p->score);83 p = p->next;84 } while (p !=NULL);85 }86 /*while(p -> next != NULL)87 {88 printf("num=%d score=%f\n", p->num, p->score);89 p = p->next;90 }*/

91 }92

93 //删除节点

95 struct student *delNode(struct student *head, intnum)96 {97 printf("delNode.\n");98 struct student *p1, *p2;99 if(head ==NULL)100 {101 printf("The List is NULL.\n");102 }103 else

104 {105 p1 =head;106 while(p1->next != NULL && p1->num !=num)107 {108 p2 =p1;109 p1 = p1->next;110 }111 if(p1->num ==num)112 {113 if(p1 ==head)114 head = p1->next;115 else

116 p2->next = p1->next;117 }118 else

119 printf("Can not find list num.\n");120 }121 returnhead;122 }123

124 //更新节点

126 struct student *update(struct student *head, int index, int num, floatscore)127 {128 printf("update.\n");129 struct student *p;130 if(head ==NULL)131 {132 printf("The List is NULL.\n");133 }134 else

135 {136 p =head;137 while(p->next != NULL && p->num !=index)138 {139 p = p->next;140 }141 if(p->num ==index)142 {143 p->num =num;144 p->score =score;145 }146 else

147 printf("Can not find list index.\n");148 }149 returnhead;150 }151

152 //增加节点153

154 struct student *add(struct student *head, int index, int num, floatscore)155 {156 printf("add.\n");157 struct student *p1, *p2, *p3;158 if(head ==NULL)159 {160 printf("The List is NULL.\n");161 }162 else

163 {164 p1 = p2 =head;165 while(p1->next != NULL && p1->num !=index)166 {167 p1 = p1->next;168 p2 =p1;169 }170 if(p1->num ==index)171 {172 p3 = (struct student *)malloc(LEN);173 p3->num =num;174 p3->score =score;175

176 if(p2->next ==NULL)177 {178 p2->next =p3;179 p3->next =NULL;180 }181 else

182 {183 p3->next = p2->next;184 p2->next =p3;185 }186 }187 else

188 printf("Can not find list index.\n");189 }190 returnhead;191 }

java 链表放置结构体_结构体和它在链表中的使用相关推荐

  1. java 共用体_结构体与共用体

    结构体 什么是结构体 结构体是C语言中的一种数据类型,它有如下特点 结构体是一种构造数据类型 把不同类型的数据组合成一个整体来自定义数据类型 结构体的定义方式与结构体变量的声明 //有名结构体 str ...

  2. 土是独体字结构吗_独体结构的字有哪些

    展开全部 独体结构是针对字的结构而e68a8462616964757a686964616f31333431336134言的,独体字的构成大致有三种情况. 1.由基本笔画构成一个部件独立成字的.如:&q ...

  3. 我的世界java版怎么用结构方块_结构方块怎么用 我的世界结构方块使用方法-游侠网...

    结构方块怎么用?在我的世界中有着非常多的方块,其中结构方块很特别,很多玩家想知道我的世界怎么使用结构方块,下面为大家带来了使用方法,想了解的玩家快来看看吧 . 我的世界怎么使用结构方块 介绍 结构方块 ...

  4. python 单链表是否有回路_(Python3)数据结构--单链表之判断链表是否有环

    前言 有Python基础 有数据结构单链表基础,没接触过的可以看下面链接 https://blog.csdn.net/sf9898/article/details/104946291 原理和实现 有一 ...

  5. C++_结构体指针_嵌套结构体_结构体做为函数参数_结构体值传递和指针传递---C++语言工作笔记026

    然后我们来看结构体指针. 可以看到我们先去定义一个结构体 然后我们在main函数中,去声明一个结构体 s 然后我们定义一个指针 int *p = &s; 指向这个结构体变量. 这里要注意

  6. java 单链表是否有环_数据结构与算法随笔之链表-链表是否有环(二)

    上一篇文章我们分析了下链表之反转单向链表,这篇文章我们来分析下另外一个关于链表的经典题目. 判断链表是否有环(在leetcode上的题目地址:环形链表) 题目描述 给定一个链表,判断链表中是否有环 解 ...

  7. java 枚举 下拉框_枚举enum在velocity模板语言中的应用-下拉菜单

    1. velocity模板vm页面 语言: #if("add" == $flag) #foreach($elem in $languageEnum) $elem.name #end ...

  8. java删除指定索引元素_将对象/元素添加到列表中的Java指定索引处

    java删除指定索引元素 We have to create a List and add objects/elements to the List and given indexes in java ...

  9. java 如何将数字倒置_每日一个小算法之整数中每位上的数字进行反转 20190810

    题目要求: 给出一个32位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321 示例 3: 输入: 120输出 ...

最新文章

  1. python udp广播_udp单播-广播-组播-python例子 | 学步园
  2. PHP数组基本的操作方法
  3. 第五周项目一-三角形类雏形(1)
  4. PowershellTFS_Part 1
  5. 协方差矩阵的实例与意义
  6. 正则表达式的匹配模式
  7. Python双版本下创建一个Scrapy(西瓜皮)项目
  8. java web后端技能树_后端技能树修炼:CAP 定理
  9. leetcode 二叉树的层次遍历 II(Binary Tree Level Order Traversal II)
  10. 一切都是骗局 Windows 8并不是很牛X
  11. java poi 导入日期为空
  12. oracle物理,Oracle物理结构概述
  13. 全面规范的软件需求可以规避项目风险
  14. 金蝶k3cloud安装时,k3cloudmanager没有,该如何处理
  15. 微星笔记本每次都进bios
  16. 讯飞智能录音笔SR702让工作体验更佳
  17. air flow空调上是什么意思_air flow空调滤芯上是什么意思
  18. Java面向对象设计多态特征理解
  19. 在进行计算机软件著作权维权时必须要进行源代码比对么?
  20. 最优控制理论 七、关于数值求解算法的总结及软件分享

热门文章

  1. 用友nc633与oracle,用友NC63安装到SQL server 2008 R2和oracle上的表空间创建语句
  2. 用友NC63 查询某个人的角色与账套
  3. 解决已经安装了新版本的.net framework,在visual studio的target framework没有显示的问题
  4. 2021年度GitHub Top 10 的Java 开源项目
  5. Elasticsearch入门到实战(二)
  6. qt(c++)数组越界编译不会报错
  7. 关于延期举办“2022CAEE中国国际家电与电子电器供应链博览会”的通知
  8. 全志V853上的ARM A7和RISC-V E907是如何通信的
  9. 什么叫做形态学图像处理_数字图像处理在二值形态学及其灰度形态学方面的应用.ppt...
  10. uninitialized urandom read