一、typedef的用法
#include<stdio.h>
typedef int aaa;
typedef struct Student{
//声明一个结构体
int age;
float score;
}ST;
int main(){
struct Student st; //声明一个结构体变量
ST st2; //使用 typedef 后,同样声明一个结构体变量
ST * pst = &st; //声明一个结构体类型的指针
int i = 10; //声明一个整型变量
aaa j = 20; //使用 typedef 后,同样声明提个整型变量
st.age = 20;
st2.age = 30;
printf("st.age = %d st2.age = %d\n",st.age,st2.age); // 20 30
printf("i = %d j = %d",i,j); // 10 20
return 0;
}
相当于给数据类型起一个别名。
也可以这么写:
#include<stdio.h>
typedef struct Student{
int age;
float score;
}*PST,ST;
int main(){
ST st; //声明一个结构体类型的变量
PST pst = &st; //声明一个结构体类型的指针变量
st.age = 10;
printf("pst->age = %d",pst->age); //10
return 0;
}
二、链表
2.1、定义
n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点,每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点。
专业术语:
- 首节点 : 第一个有效节点
- 尾节点 : 最后一个有效节点
- 头结点 : 第一个有效节点之前的节点,头节点并不存放有效数据,加头结点的目的是为了方便对链表的操作,头结点的数据类型和首节点是一样的。
- 头指针 : 指向头节点的指针变量
- 尾指针 : 指向尾节点的指针变量
确定一个链表需要几个参数?
答: 只需要一个参数:头指针
因为通过头指针可以推算出链表的其他所有参数。
一个节点分为数据域和指针域两部分,其中指针域指向下一个节点的整体,下一个节点的数据类型和这个节点是一样的。
2.2、分类
-
单链表
-
双链表 : 每一个节点有两个指针域
-
循环链表 : 最后一个节点的指针域指向头节点;能通过任何一个节点找到其他节点。
p->pNext //p所指向结构体变量中的pNext成员本身,内容是一个结构体变量的地址
2.3、单链表
单链表的各种操作
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node{
int data; //数据域
struct Node * pNext; //指针域,指向下一个结点整体
}NODE,* PNODE;
PNODE creat_list(); // 1.创建一个非循环单链表,并将该链表的头结点的地址赋给 pHead
void traverse_list(PNODE pHead); // 2.遍历输出
bool empty_list(PNODE pHead); // 3.判断链表是否为空
int length_list(PNODE pHead); // 4.求链表长度
bool