链表
链表是一种有序的列表,链表的内容通常是存贮于内存中分散的位置上。而链表串联的方式有两种:
(1)利用数组结构串联的有序列表。如:利用两个数组,一个存放数据,另一个存放连接的关系,假设是从数组中的Data[4]元素开始则数据的链接关系如下图:
0 1 2 3 4 5 6 7 8 9
is | data | this | a | array | !! |
(上下一一对应):
6 | 8 | 1 | 3 | 9 |
不过这种链表最大的缺点在于放入或删除元素,常常要大量的移动其他元素,而且数组的大小是固定的,缺乏使用弹性。
(2):第二种是以动态内存配置的链表。一个动态内存的配置链表,是由许多的节点所链接而成的,每个节点包含了数据部分和指向链表中下一节点的指针。以动态内存配置的链表,在插入或删除元素时,只需要将指针改变指向即可。
结构体类型定义:
struct s{ //struct是结构体类型的关键字,s为结构体名
char name[10];
int age;
char sex;
};
结构体变量的定义方式有3种:
(1)先定义结构体,后定义结构体变量。
struct s{
char name[10];
int age;
char sex;
}
struct s s1,s2;
(2)
struct s{
char name[10];
int age;
char sex;
}s1,s2;
(3)只定义结构体变量:
struct {
char name[10];
int age;
char sex;
}s1,s2;
结构体嵌套:
struct time{
int hour;
int minute;
int second;
}t;
struct data{
int day;
int month;
int year;
struct time t;
}d;
结构体类型引用:----->结构体变量名.成员名
结构指针:
结构体指针可以指向结构体变量的首地址,其定义形式如下: struct 结构体类型*指针名
struct st{
char name[10];
int age;
char sex;
float score;
}s;
struct st*p;
定义了一个结构体st的指针p,但其值是不确定的。通过下语句可以将结构体变量s的地址赋给p,使p指向结构体变量s。
p=&s; (其中&为去地址符号,&s表示结构体变量s的地址)
指针赋值后,通过指针即可访问结构体中的成员,如:(*p).name (*p).sex
另一种方式来访问结构体成员,即运用运算符“——>”如下所示:p——>name ,p——>sex.
结构体数组指针:
#include<stdio.h>
struct st{
char name[10];
int age;
char sex;
}s[3];
void main(){
struct st s[3]={{"zhangsan",20,'M'},{"lisi",21,'W'},{"wangjia",22,'W'}};
struct st *p;
p=s;
for{int i=0;i<3;i++}{
printf("%s,%d,%c",p->name,p->age,p->sex);
p++;
}
}
(++p)->num和(p++)->num的区别:
(1)(++p)->num:先使p的值加一,使p指向数组的下一个元素再访问该结构体成员num。
(2)(p++)->num:先访问元素的结构体成员num,再使p的值加一,指向下一个元素。
结构体数组指针p指向数组有以下三种形式:
(1)p=s (2)p=&s (3)p=&s[0]