20140504 无法登陆无线路由 带头结点队列 静态链表

1、无法登陆TP-LINK路由器

原因是电脑的IP地址不是192.168.1.X;

设置电脑的无线连接的静态IP为192.168.1.2;登陆路由器即可

2、没有用malloc给q分配内存的错误提示

image

3、定义函数出现的错误

假如create函数要用到queue()函数:那么queue函数一定要定义在create函数之前.下面的情况会出错

queue *create()
{    
        .................
}
void in_queue(queue *q,int x )
{                                                                                                                                                                                 ..............................
}

 

image

4、带头结点队列的总结

1、要考虑删除最后一个节点后队列为空的情况

2、队列为空的条件什么

3、三个create函数的异同(见代码)

4、链式队列一般不用考虑堆满的情况

//这是一个带头结点的队列,头结点的指向始终不变,实际上头结点不是队列的一部分。只是为了边界问题的统一操作
#include<stdio.h>   
#include<malloc.h>
typedef struct student//队列结点 
{
    int data;
    struct student *next;
}node;

typedef struct queue//队头指针(保持不变)和队尾指针(入队时会发生变化)
{
    node *front;
    node *rear;
}queue;

void in_queue(queue *q,int x )  //带头结点的好处是入队操作统一,不用考虑边界情况
{
    node *s=(node *)malloc(sizeof(node));
    s->data=x;
    s->next=NULL;
    q->rear->next=s;
    q->rear=s;                                                                                                                             }

void out_queue(queue *q)//出队操作仍然要考虑边界情况(即删除最后一个节点后,队列为空
{
    node *p;
    if((q->front==q->rear))    //队列是否为空
        printf("queue is already NULL\n");
    else
    {
        p=q->front->next;   //p为待删除的节点
        q->front->next=q->front->next->next;//删除最后一个节点之后
        if(p==q->rear)    
            q->rear=q->front;//这句话很关键,目的是为了应对删除p之后,队列为空的情况,表示删除最后一个节点后,需要人为把队列至空(q->rear=q->front
        printf("%d is out\n",p->data);
        free(p);
    }
}

queue *create()//和create1对比,create函数利用了返回值
{
    queue *q=(queue *)malloc(sizeof(queue));
    int x=0;
    q->front=(node *)malloc(sizeof(node));
    q->front->data=0;
    q->front->next=NULL;
    q->rear=q->front;
    printf("please input data:");
    scanf("%d",&x);
    while(x!=0)
    {
        in_queue(q,x);
        printf("please input data:");
        scanf("%d",&x);
    }
    return q;
}

void create1(node *front,node *rear)  //思考create1为什么不能创建队列?因为要修改指针front和rear,必须传入的是这两个指针的地址。
{
    //queue *q=(queue *)malloc(sizeof(queue));
    int x=0;
    front=(node *)malloc(sizeof(node));
    front->data=0;
    front->next=NULL;
    rear=front;
    printf("please input data:");
    scanf("%d",&x);
    while(x!=0)
    {
        node *s=(node *)malloc(sizeof(node));
        s->data=x;
        s->next=NULL;
        rear->next=s;
        rear=s;       
        printf("please input data:");
        scanf("%d",&x);
    }
    //return q;
}

void create2(queue *q)//这里没有利用返回值,为什么成功了?原因是q指针里存的内容就是front和rear指针,这里q就是相当于指针front和rear的地址
{
    int x=0;
    q->front=(node *)malloc(sizeof(node));
    q->front->data=0;
    q->front->next=NULL;
    q->rear=q->front;
    printf("please input data:");
    scanf("%d",&x);
    while(x!=0)
    {
        in_queue(q,x);
        printf("please input data:");
        scanf("%d",&x);
    }
}

void display(queue *q)
{
    node *p=q->front->next;
    while(p!=NULL)
    {
        printf("%d  ",p->data);
        p=p->next;
    }
    printf("\n");
}


void main()
{
    /* *********方法一:create函数为什么成功********** */
    queue *q=create(); 
    /* *******方法二:create1()为什么失败 ********/
    /*queue *q=(queue *)malloc(sizeof(queue));
    q->front=(node *)malloc(sizeof(node));
    q->front->data=0;
    q->front->next=NULL;
    q->rear=q->front;
    create1(q->front,q->rear);*/
    /*****************方法三:create2为什么成功**************************/
    //queue *q=(queue *)malloc(sizeof(queue));
    //create2(q);
    out_queue(q);
    out_queue(q);
    display(q);
}

6、什么是静态链表?

http://blog.csdn.net/jnu_simba/article/details/8831150

typedef struct Node
{
    ElemType data; //存放数据
    int cur; //存放下一个节点的下标,为0时表示无指向
} StaticLinkList[MAXSIZE];

转载于:https://www.cnblogs.com/yexuannan/p/3707795.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值