#include<stdio.h>
//节点的结构体
typedef struct button{
int data;
struct button *Next;
}Button_t;
//头结点 指针
static struct button* Head_Button = NULL;
//打印这个链表 因为头是全局变量 所以无需传参
static void Show_ButtonList(void){
Button_t* p=Head_Button;
//printf("ADDR::NewNode:%08x-Head:%08x\n",p, &Head_Button);//不一样的!说明p Head_Button的内存地址不同 他们是指向相同而已!head不会变化的
while(p) {
printf("Node::Address:%08x data:%d Next:%08x--> ",p,p->data,p->Next );
p=p->Next;
}
printf("\r\n" );
}
//查找一个节点 依靠按键类的data判定 如果有 找到返回1 没找到返回0
static int Search_Button(Button_t* btn){
struct button* pass_btn;
for(pass_btn = Head_Button; pass_btn != NULL; pass_btn = pass_btn->Next)
{
if(pass_btn->data == btn->data)
return 1;
}
return 0;
}
//增加一个节点 成功0 失败1
static int Add_Button(Button_t* btn){
if(Search_Button(btn))//找到
return 1;
//*新来的就是头
btn->Next = Head_Button;
Head_Button = btn;
return 0;
}
//删除一个节点 成功0 失败1
static int Button_Delete(Button_t *btn){
struct button** curr;
if(Search_Button(btn)==0)//没找到
return 1;
for(curr = &Head_Button; *curr;)
{
struct button* entry = *curr;//非常巧妙 二级指针迂回保护了头没有动!
if (entry == btn)
{
*curr = entry->Next;
}
else
{
curr = &entry->Next;
}
}
return 0;
}
/*
递归
前面的输出是
进
出
进
出
进
截止了!最后进来 就提前终结了
*/
Button_t *Button_Reverse(Button_t *head){
printf("进\n");
Button_t * newhead;
if(head == NULL || head->Next == NULL)
return head;
printf("出\n");
newhead = Button_Reverse(head->Next);
printf("new :%d ",newhead->data );
head->Next->Next = head;
head->Next=NULL;
return newhead;
}
int main()
{
printf("%s\n","hello" );
Show_ButtonList();
struct button b1,b2,b3,b4;
b1.data=1;
Add_Button(&b1);
Show_ButtonList();
b2.data=2;
Add_Button(&b2);
Show_ButtonList();
b3.data=3;
Add_Button(&b3);
Show_ButtonList();
b4.data=4;
Add_Button(&b4);
Show_ButtonList();
Button_Delete(&b3);
Show_ButtonList();
Head_Button = Button_Reverse(Head_Button);
Show_ButtonList();
}
08-20
1255

05-04
1280

02-26
230
