有头单链表笔试

#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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值