https://www.bilibili.com/video/BV1vb411m7JV 如果不带头节点,那么链表在头插入时,头节点会变动。如果带头节点,那么整个链表的头就是头节点。 链表 #include stdio.h #include string.h #in
https://www.bilibili.com/video/BV1vb411m7JV
如果不带头节点,那么链表在头插入时,头节点会变动。如果带头节点,那么整个链表的头就是头节点。
链表
typedef struct{
int data;
struct Node* next; // 指针变量的空间可以确定,所以可以嵌套指针变量
}Node;
Node* SListCreate_head() // 头插法
{
Node* head = (Node*)malloc(sizeof(Node));
if(head != NULL)
{
head->data = -1;
head->next = NULL;
}
int data;
while(scanf("%d", &data) && data != -1)
{
Node* p = (Node*)malloc(sizeof(Node));
if(p != NULL)
{
p->data = data;
p->next = NULL;
}
p->next = head->next;
head->next = p;
}
return head;
}
Node* SListCreate_tail() // 尾插法
{
Node* head = (Node*)malloc(sizeof(Node));
if(head != NULL)
{
head->data = -1;
head->next = NULL;
}
Node* q = head;
int data;
while(scanf("%d", &data) && data != -1)
{
Node* p = (Node*)malloc(sizeof(Node));
if(p != NULL)
{
p->data = data;
p->next = NULL;
}
q->next = p;
q = p;
}
return head;
}
int SListPrint(Node* head) // 遍历
{
Node* q = head;
while(q != NULL)
{
printf("%d\n", q->data);
q = q->next;
}
return 0;
}
int SLDeleteEvenNum(Node* head) // 删除所有偶数节点
{
if(head->next == NULL)
return -1;
Node*q = head, *p = head->next;
while(p != NULL)
{
if(p->data % 2 == 0)
{
// printf("%d\n", p->data);
q->next = p->next;
free(p); // 以后可在调用malloc、realloc以及calloc函数来再分配。free只是标记一下某块内存可用,但并不重写内容.
p = q->next;
continue; // 很重要
}
q = p;
p = p->next;
}
}
int SListDestory(Node* head)
{
if(head == NULL) return -1;
int i = 0;
Node* destoryNode;
while (head)
{
destoryNode = head;
head = head->next;
free(destoryNode), i++;
}
return i;
}
int main()
{
Node* head = NULL;
head = SListCreate_tail();
SLDeleteEvenNum(head);
SListPrint(head);
printf("%d\n", SListDestory(head));
return 0;
}
函数指针变量的定义
指向函数的指针。
定义有三种方式:
int func(int data)
{
printf("a=%d\n", data);
return 0;
}
int main()
{
// 1. 先定义函数类型,根据类型定义指针变量
typedef int FUN(int data); // FUN 函数类型
FUN* p1 = NULL; // 函数指针变量
p1 = &func; // p1 指向 func 函数
func(1); // 传统调用方法
p1(6); // 函数指针调用方法
// 2. 先定义函数指针类型,根据类型定义指针变量
typedef int(*PFUN)(int); // 函数指针类型
PFUN p2 = func;
p2(7);
// 3. 直接定义函数指针
int(*p3)(int) = func;
p3(8);
int(*p4)(int);
p4 = func;
p4(9);
return 0;
}
函数指针的应用
#include <stdio.h>#include <string.h>
#include <stdlib.h>
void add()
{
printf("add func\n");
}
void minus()
{
printf("minus func\n");
}
void multi()
{
printf("multi func\n");
}
void divide()
{
printf("divide func\n");
}
int main()
{
// void(*func)() = add;
// func();
void(*func[4])() = {add, minus, multi, divide}; // 函数指针数组
// char *buf[] = {"add", "minus", "multi", "divide"}; // 指针数组
for(int i = 0; i < 4; i++)
{
func[i]();
}
return 0;
}
/*
add func
minus func
multi func
divide func
*/
回调函数
int function(int a, int _)
{
return a;
}
int add(int a, int b)
{
return a + b;
}
int minus(int a, int b)
{
return a - b;
}
typedef int(*Q)(int, int);
// void func(int, int, Q P)
void func(int x, int y, int(*p)(int, int))
{
int a = p(x, y);
printf("%d\n", a);
}
int main()
{
func(1, 2, add);
func(10, 5, minus); // 多态
func(-1, NULL, function);
return 0;
}
链表内存四区图