数据结构-队列

队列是一种先进先出的数据结构

#include <stdio.h>
#include <malloc.h>

typedef struct Node
{
  int data;
  struct Node *next;
}Node,SeqList;
SeqList *L;
//初始化一张空的单链表
//注意:指针的传递也是形参,只是指向的地址是不变
//1.定义一个指针p向系统申请一段内存
//2.头节点指针指向这个内存
//3.将头节点的下一个节点指向空
int init(SeqList **head)
{
    SeqList * p =malloc(sizeof(SeqList));
    *head =p;
    p->next=NULL;
    p->data=0;
    return 0;
}
//获取最后的一个节点
//1.定义一个指针p指向头节点
//2.递归比较p的next是否为空(即最后的一个节点)
//3.将当前节点的地址返回
Node * getEndNode(SeqList *head)
{
	SeqList *p = head;
	while(p->next!=NULL)
	{
	  p=p->next;
	}
	return p;
}
//销毁一个单链表
//1.创建两个指针p,q(头节点)
//2.p,q指向头节点
//3.p指向头节点的下一个节点
//4.q的next指向头节点的下一个节点的下一个节点
//5.释放头节点的下一个节点p
//6.将p指向q(p指向头节点的下一节点)
//思想是递归删除第一个节点
void Destruction_List(SeqList **head)
{
	Node *p,*q;
	p=q=*head;
	p=p->next;
	while(p!=NULL)
	{
	   q->next=p->next;
	   free(p);
           p=q->next;	   
	}
}
//向队列中插入一个数据,尾插法
//1.定义一个指针p
//2.p指向头节点
//3.获取最后一个节点
//4.将p的next节点申请一块内存
//5.填充数据
int put(SeqList **head)
{
  Node *p=*head,*q;
  if(p==NULL)
  {
     return -1;
  }
  printf("Plese Input data:\n");
  p=getEndNode(*head);
  p->next=(Node *)malloc(sizeof(Node));
  scanf("%d",&p->next->data);
 // p->next->data = i;
  p->next->next=NULL;
 // head->next=p;
}
//弹出头节点
Node* pop(SeqList **head)
{
    Node *p,*q;
    p=*head;
    if(p->next==NULL)
    {
	    return NULL;
    }
    q=p->next;
    p->next=q->next;
/*    while(p->next->next!=NULL)
    {
	 p=p->next;
    }
    q=p->next;
    p->next=NULL;*/
    return q;
}
void show_List(SeqList *head)
{
  SeqList *p =head->next;
  while(p!=NULL)
  {
	  printf("%d",p->data);
	  p=p->next;
  }
  printf("\n");
}
Node * findNode(SeqList *head,int data)
{
	Node *p=head;//p指向头节点
        p=p->next;
	while(p!=NULL)
	
{
	
//			printf("p:%d\n",p->data);
		if(p->data==data)
		{
			return p;
		}
		else
		{
			p=p->next;
		}
	}
	return NULL;
}

int main()
{
  init(&L);
  int i;
  for(i=0;i<5;i++)
  put(&L);
  show_List(L);
  Node *n = pop(&L);
  printf("pop data: %d\n",n->data);
  free(n);
  show_List(L);
  if(L->next==NULL)
  {
	  printf("SeqList is NULL\n");
  }
  show_List(L);
  //printf("L p:%p",L->next);
n =   findNode(L,5);
if(n!=NULL)
{
	printf("find data is:%d\n",n->data);
}
else
{
	printf("find data is NULL\n");
}
  Destruction_List(&L);
  show_List(L);
  return 0;
}
end
  • 作者:(联系作者)
  • 更新时间:2023-07-06 18:54
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论

    新增邮件回复功能,回复将会通过邮件形式提醒,请填写有效的邮件!