# include<stdio.h>
# include<stdlib.h>

/*s声明一个结构体*/
typedef struct nood
{
   
	int data;
	struct nood *next;
} link_list;



/*创建带头链表*/ 
link_list *creat_head()
{
   
	int x;
	link_list  *head,*p,*r;
	p=(link_list *)malloc(sizeof(link_list));
	p->next=NULL;
	head=p;
	r=p;
	printf(" 请输入,0表结束:\n");
	scanf("%d",&x);
	while(x!=0)
	{
   
			p=(link_list *)malloc(sizeof(link_list));
			p->data=x;
			p->next=NULL;
			r->next=p;
			r=r->next;
		    scanf("%d",&x);
			
	}
	return (head);
		 
}

/*删除链表*/
int delat_list(link_list *head3,int x)
{
   
	link_list *p,*s;
	int i=0;
	p=head3;
	if(p->next==NULL)
	{
   
		printf("链表为空\n");
		return 0; 
	}
	while((p->next!=NULL)&&(i<x-1))
	{
   
		i++;
		p=p->next;
	}
	if(p->next==NULL||(i>=x))
	{
   
		printf("不存在该节点\n");
		return 0;
	}
	else 
	{
   
		s=p->next;
		p->next=s->next;
		free(s);
	}
}
/*清除链表*/
void Clear_List(link_list *head3)
{
   
	head3->next=NULL;       //为什么不能直接head=NULL; 
}
/*得到链表的长度*/
int GetListLen(link_list *head3)
{
   
	int x=0;
	link_list *p,*s;
	p=head3;
	while(p->next!=NULL)
	{
   
		p=p->next;
		x++;
	} 
	return x;
}
/*输出链表*/
int show_list(link_list *head3)
{
   
	 link_list *p;
	  p=head3->next;
	  if(EmptyList(p))
	  {
   
	  	  printf(" 该链表为空\n");
	  	  return 0;
	  }
	  while(p!=NULL)
	  {
   
	  	   printf("%4d",p->data);
	  	   p=p->next;
	  }
	  printf("\n");
	  return 1;
	  
}
/*判断是否为空*/
int EmptyList(link_list *head1)
{
    
    link_list *p;
    p=head1; 
    if(p->next==NULL)
	          return 1;   
    else  return 0;
} 
/*改变链表的数值*/
int ChangeList(link_list *head1,int x,int y)
{
   
	link_list *p;
	int a=0;
	p=head1;
	if(EmptyList(p))
	    {
   
	    	printf("链表为空:\n");
			return 0; 
		}
	if(x>GetListLen(head1))
	{
   
		printf("位置超出了最大\n"); 
		return 0;
	}
	while(a<x-1)
	{
   
		p=p->next;
		a++;
	}
		p->next->data=y;
		return 1;
	
}
/*插入链表*/
int InsertList(link_list *head1,int x,int y)     //link_list *head1,int x,char y 插入链表的头结点,位置,以及数值
{
   
	 link_list *p,*s,*q;
	 p=head1;
	 int i=0;
	if(EmptyList(p))
	    {
   
	    	printf("链表为空:\n");
			return 0; 
		}
	if(x>GetListLen(head1))
	{
   
		printf("位置超出了最大\n"); 
		return 0;
	}
	s=(link_list *)malloc(sizeof(link_list));
	if(s==NULL)
	{
   
		printf("开辟空间失败\n");
		return 0;
	}
	s->data=y;
	s->next=NULL;
	while(i<x-1)
	{
   
		p=p->next;
		i++;
	}
	q=p->next;
	p->next=s;
	s->next=q;
	return 0;	 
	  
} 
/*查找链表*/
int SearchList(link_list *head1,int x)  //SearchList(link_list *head1,int x) 按照顺序查找 
{
   
	link_list *p,*s;
	p=head1;
	int i=0;
	if(EmptyList(p))
	    {
   
	    	printf(" 链表为空:\n");
			return 0; 
		}
	while((p->data!=x)&&(p->next!=NULL))
	{
   
		p=p->next;
		i++;	
	}
	printf("i==%d\n",i); 
	if((p->next==NULL))
	{
   
		 printf(" 链表不存在数值--%c\n",x);
		 return 0;
	}
	printf(" %d--存在,位置在--%d\n",x,i);
	return 1;
	
	 
}

 /*链表倒置*/ 
int Invert(link_list *head1)
{
    
      link_list *p,*s,*r;
	  p=head1->next;
	  s=(link_list *)malloc(sizeof(link_list));
	  s=NULL;
	  r=s;
	  while(p!=NULL)
	  {
     
	       	s=(link_list *)malloc(sizeof(link_list)); 
	  	    s->data=p->data;
	  	    s->next=r;
			r=s; 
	  	    p=p->next; 
	  } 
	  head1->next=r;
	  
} 
 
/*主函数*/
int main()
{
   
	printf("\n"); 
	printf("************链表功能表************\n");
	printf("\n"); 
	printf("************功能对应数字************\n");
	printf("\n"); 
	printf("************删除--------1************\n");
	printf("\n"); 
	printf("************倒置--------2************\n");
	printf("\n"); 
	printf("************插入--------3************\n");
	printf("\n"); 
	printf("********得到长度--------4************\n");
	printf("\n"); 
	printf("************查找--------5************\n");
	printf("\n");
	printf("********退出功能--------6************\n");
	printf("\n");
	int x;
	int i,j,a,b,flag=1;
	link_list *head1;
	head1=creat_head();
	printf("\n"); 
	printf("输入初始化链表的数值:\n"); 
	show_list(head1);
	printf("\n");
	printf("对照上面功能表选数字:\n");
	while(flag)
	{
   
	scanf("%d",&j); 
	switch(j) 
         	  {
    
         	    case 1:     printf("\n"); 
         	                printf("输入要删除的位置:\n");
         	                scanf("%4d",&i);
				            printf("输入删除后链表的数值:\n"); 
                            printf(" 删除位置为----%d:\n",i);
                            delat_list(head1,i);
	                        show_list(head1);
	                        printf("对照上面功能表选数字:\n");
	                        break;
	                            	
         	    case 2:      printf("\n"); 
	                         printf("倒置链表后的链表为:\n");
	                         Invert(head1);
 	                         show_list(head1); 
 	                         printf("\n");
 	                         printf("对照上面功能表选数字:\n");
 	                         break;
 	                         	
			    case 3: 	 printf("\n"); 
				             printf("输入需要插入链表的位置以及数值:\n");
			                 scanf("%d%d",&a,&b);
				             printf("输入插入链表后链表的数值:\n");   
				             printf(" 插入位置为--%d,插入数值为--%d:\n",a,b);   
							 InsertList(head1,a,b);
							 show_list(head1);
							 printf("\n"); 
							 printf("对照上面功能表选数字:\n");
							 break;
							 	
         	  	case 4:    printf("\n"); 
				            x=GetListLen(head1);
	                        printf("此链表的长度为:%d\n",x);
	                        printf("\n");
							printf("对照上面功能表选数字:\n"); 
							break;
         	  	
	            case 5:     printf("\n"); 
				            printf("请输入要查找的数:");
				            scanf("%d",&i);printf("查找 %d 的位置:\n",i); 
						    SearchList(head1,i); 
						    printf("\n"); 
						    printf("对照上面功能表选数字:\n");
						    break;
						    
				case 6:     printf("\n"); 
				            flag=0;
				            printf("功能跳出\n");
							break;
						    
	            default: printf("无效的选择\n");
			}
			  }


	return 0;
}
# include<stdio.h>
# include<stdlib.h>

# define max_size 100 

# define true 1 
# define fault 0 

/*申明一个结构体*/ 
typedef struct node
{
    
    int max[max_size];
     int top_number;
	  
} sqstack;

/*判断是否为空盏*/ 
 int emplty(sqstack *s)
{
   
	if(s->top_number<0)
	      return true;
	else return fault;
}

/*压盏儒盏*/ 
int push( int x,sqstack *s)
{
   
	if(s->top_number>max_size-1)
	    {
   
	    	  printf("盏已满:\n"); 
	    	  return fault;
		}
	else
	 {
   
	 	     s->max[(s->top_number)++]=x;
			  return true; 
	 } 
			
}
/*取盏取盏*/

 int get( int y,sqstack *s) 
{
   
	if(s->top_number<0)
	     {
   
		 printf("the sqstack is empty\n");
		 return fault;
		 }
		 s->top_number--;
		 return(s->max[s->top_number+1]);
	     
}

/*取栈顶元素*/
 int  getstop(sqstack *s)
{
   
		if(s->top_number<0)
	     {
   
		 printf("the sqstack is empty\n");
		 return fault;
		 }
		 return(s->max[s->top_number]);
}

/*遍历盏*/
void show_sqstack(sqstack *s)
{
   
	   int i;
	   printf("the sqstack number is;\n");
	   for(i=s->top_number;s>0;s--)
	        printf("%4d",s->max[i]);
}
  


int main()
{
   
	int x,i;
	sqstack *b;
	b->top_number=0;
	printf("请输入你要输入的数据:\n");
	scanf("%d",&x); 
	for(i=0;i<x;i++)
	   {
   
	           push( i, b);
	   }
	show_sqstack(b);

      return 0;	  
}