#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node {
int data;
struct Node* next;
}Lnode,Linklist;
void InitList(Linklist* l){//初始化无头单向链表
int i;
for(i=1;i<10;i++){
l->data=i;
l->next=malloc(sizeof(struct Node));
l=l->next;
}
l->data=10;
l->next=NULL;
}
int GetLenOfList(Linklist* l){//获取链表的长度
int len=0;
while(l!=NULL){
len++;
l=l->next;
}
return len;
}
void ReverseList(Linklist* l){//链表内容的反转
int len=GetLenOfList(l);
int d[len];//储存链表内容
int i=0;
Linklist* p=l;
while(p!=NULL){
d[i]=p->data;
p=p->next;
i++;
}
i=1;
p=l;
while(p!=NULL){
p->data=d[len-i];
p=p->next;
i++;
}
}
void DeleteList(Linklist* l){
//释放malloc动态分配的内存,虽然小程序可以忽略不计,但是还是要养成好习惯
Lnode* p=l->next;
while(p!=NULL){
Lnode* q=p;
p=p->next;
printf("node : %d is free\n",q->data);
//输出要释放的节点的内容
free(q);//释放完的指针并不为空,仍指向原内存,不过原内存会标记为已释放,原内存的内容也不一定发生变化
printf("now data = %d \n",q->data);
//这个free完指针指向的内容不一定发生变化,用printf可能无法检测是否free成功
//可以再free一下检测,如下代码(注释的if部分)
/*if(q->data<10){
printf("data = %d \n",q->data);
free(q);//再free一次,判断是否free成功,
//如果出错代表已经释放过内存了,重复释放就会报错
}*/
}
l->next=NULL;
}
int main()
{
Linklist list_test;
InitList(&list_test);
printf("初始化:\n");
Lnode* p=&list_test;
while(p!=NULL){
printf("%d\n",p->data);
p=p->next;
}
ReverseList(&list_test);
printf("反转:\n");
p=&list_test;
while(p!=NULL){
printf("%d\n",p->data);
p=p->next;
}
DeleteList(&list_test);
printf("删除后:\n");
p=&list_test;
while(p!=NULL){
printf("%d\n",p->data);
p=p->next;
}
return 0;
}