#include<time.h>
#include<string.h>
#define N 10 //定义一个常量N 值为10;
#define DD struct dangdang
//用指向结构体的指针作为函数参数
//1:用结构体变量的成员作为参数是用什么样的方式来传递
//2:值传递,新建一个变量接受实际参数的值
//结构体变量
//包含一个地址指向下一个指针
#include<string.h>
#define N 10 //定义一个常量N 值为10;
#define DD struct dangdang
//用指向结构体的指针作为函数参数
//1:用结构体变量的成员作为参数是用什么样的方式来传递
//2:值传递,新建一个变量接受实际参数的值
//结构体变量
//包含一个地址指向下一个指针
动态链表:链表需要存储下一个节点的地址
struct Node
{
int num;//创建一整型变量
struct Node * pNext;//指针无论任何类型都是4个字节,将指针为pNext,因为它在这里指向下一个数据
};
void main1()//用动态的方式构建一个链表,用循环的方式如何遍历这个链表
{
struct Node *p=NULL;//创建一指针,作用就是头指针
//我们要实现动态链表,我们该怎么做?分别定义几个指针
struct Node *p1, *p2, *p3, *p4, *p5;
//创建5个节点指针,对p1,p2,p3,p4,p5进行分配内存动作
首先对p1进行分配内存动作,调用malloc函数,输入sizeof,传入结构体大小,然后实现指针类型的转换,malloc的返回值是一个空指针,所以我们需要把它转换成struct Node 类型。
p1 = (struct Node *)malloc(sizeof(struct Node));//malloc是空指针,我们要把它转换成struct Node
p2 = (struct Node *)malloc(sizeof(struct Node));
p3 = (struct Node *)malloc(sizeof(struct Node));
p4 = (struct Node *)malloc(sizeof(struct Node));
p5 = (struct Node *)malloc(sizeof(struct Node));
//接下来对每个节点数据进行初始化
p1->num = 1;
p2->num = 2;
p3->num = 3;
p4->num = 4;
p5->num = 5;
//接下来我们对指针进行初始化
p = p1;
p1->pNext = p2;
p2->pNext = p3;
p3->pNext = p4;
p4->pNext = p5;
p5->pNext = NULL;//进行链接
//访问链表所有元素,最简单的
printf("%d\n",p->num);
printf("%d\n", p->pNext->num);
printf("%d\n", p->pNext->pNext->num);
printf("%d\n", p->pNext->pNext->pNext->num);
printf("%d\n", p->pNext->pNext->pNext->pNext->num);
//链表的2个优点插入和删除
//删除3这个节点
p2->pNext = p3->pNext;//删除节点
free(p3);//实现删除,释放内存
//插入2种方式
//尾部插入
struct Node *p6;//重新构建一节点p6
p6 = (struct Node *)malloc(sizeof(struct Node));//对p6进行分配内存
p6->num = 6;//进行赋值
p6->pNext = NULL;
p5->pNext = p6;
//中间插入
struct Node *p7;//重新构建一节点p7
p7 = (struct Node *)malloc(sizeof(struct Node));//对p7进行分配内存
p7->num = 7;
p7->pNext = p2->pNext;
p2->pNext = p7;
//链表的2个缺点修改和查询
//修改
struct Node *py = p;//创建一个指针副本保存头结点的地址
//初始化条件struct Node *py = p;
//循环终止条件px != NULL
//循环区域终止
py=py->pNext
for (struct Node *py = p; py!= NULL;py=py->pNext)//遍历每一个节点
{
if (py->num==3)
{
py->num = 30;
}
}
//查询
struct Node *px = p;//创建一个指针副本保存头结点的地址
//用do while方式循环遍历了这样一个动态链表12345
do{
printf("\ndo while=%d", px->num);//打印数据
px = px->pNext;//实现向前移动
} while (px != NULL);//当px!=NULL的时候,我们继续,循环的终止条件
getchar();
}