#include <stdio.h>
#include <stdlib.h>
//创建结构体:重命名为node_t,指针重命名为p2node_t
typedef struct linknode{
int data;
//next指针的作用是用来指向下一个“struct link node*”类型的变量。
struct linknode* next;
}node_t,*p2node_t;
int main(int argc,constchar * argv[]) {
//第一节点
node_t node_01;
node_01.data =10;
node_01.next =NULL;
//第二节点
node_t node_02;
node_02.data =20;
node_02.next =NULL;
//第三节点
node_t node_03;
node_03.data =30;
node_03.next =NULL;
//定义头指针:
//p2head的作用是用来追踪(记录)当前节点地址(位置)
p2node_t p2head =NULL;
p2head = &node_01;
node_01.next = &node_02;
node_02.next = &node_03;
//尾节点的next为NULL
for(;p2head!=NULL;p2head = p2head->next){
printf("%d\n",p2head->data);
}
//链表逆序输出
node_01.next = node_01.next->next;
node_02.next = p2head;
p2head = &node_02;
p2head =NULL;
{
//与上面创建节点类似,不过下面的方法是通过for循环创建10个同名节点
//但是除了名字相同外,却各不相同,他们有自己的data,next和地址
for(int i =1;i<10;i++){
//创建新节点pp
p2node_t pp = (p2node_t)malloc(sizeof(100));
//检查是否分配成功
if (pp ==NULL) {
perror("no much RAM!");
}
//新节点pp数据存储
pp->data = i;
//pp节点的next始终是指向上一个pp节点的地址的,如果没有则为零
pp->next = p2head;
/*
p2head指向当前pp节点的地址
第一次循环开始时,p2head所指向的是data=1的pp节点的地址
最后一次循环结束时,p2head所指向的时data=10的pp节点的地址
*/
p2head = pp;
}
for (int i =1; i<10; i++) {
printf("%d\n",p2head->data);
/*
第一次循环开始时p2head所指向的是data = 10的存储节点,即
p2head = pp;而p2head->next = pp->next,因为pp->next所指向
的是上一个pp节点地址,所以······
*/
p2head = p2head->next;
}
for (int i =1; i<10; i++) {
//释放内存:
free????
}
}
//内存泄露特例:
//char* a[] = {NULL};
//a[0]=(char*)malloc(100);
//a[1]=(char*)malloc(100);
//a[0] ="you are y";
//a[1]d的内存就变成垃圾了,但是依然保留,
//a[1] = a[0];
printf("Hello, World!\n");
return0;
}