/**
单向链表逆序
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define xprintf printf
#define LL_ADD(node,list) do{ \
if(list==NULL){ \
list=node; \
}else{ \
node->next=list; \
list=node; \
} \
}while(0)
#define LL_PRINT(list) do{ \
NODE* header=list; \
while(1){ \
if(header){ \
xprintf("%d ",header->data); \
header=header->next; \
}else{ \
xprintf("\n"); \
break; \
} \
} \
}while(0)
//第一种方式逆序
/***
**
1、以临时节点指向新表
2、每从旧表中取出头结点,放入临时节点的后节点
***/
#define LL_REVERSE(list) do{ \
NODE* temp=(NODE*)malloc(sizeof(NODE)); \
NODE* next=NULL; \
if(list == NULL) \
break; \
while(list){ \
next=list->next; \
list->next=temp->next; \
temp->next=list; \
list=next; \
} \
list=temp->next; \
free(temp); \
}while(0)
//第二种方式逆序
/*
1、创建新表reverse
2、每从旧表中取出头结点放入新表头部
最终得到的就是逆序后的表
*/
#define LL_REVERSE2(list) do{ \
NODE* reverse=NULL; \
NODE* next=list->next; \
if(list == NULL) \
break; \
while(next){ \
next=list->next; \
list->next=reverse; \
reverse=list; \
list=next; \
} \
list=reverse; \
}while(0)
struct _node{
int data;
struct _node* next;
};
struct _list{
int data;
struct _node* next;
};
typedef struct _node LIST;
typedef struct _node NODE;
int main(){
LIST* list=NULL;
int i=0;
xprintf("add start\n");
for(i=0;i<10;i++){
NODE* node=(NODE*)malloc(sizeof(NODE));
node->data=i;
node->next=NULL;
LL_ADD(node,list);
}
xprintf("add end\n");
LL_PRINT(list); //原表输出
LL_REVERSE(list); //方法一,逆序
LL_PRINT(list); //输出方法一逆序后的表
LL_REVERSE2(list); //方法二,逆序
LL_PRINT(list); //输出方法二逆序后的表,和原表一致
while(list){
NODE* header=list;
list=list->next;
free(header);
}
return 0;
}