lizm666 2022-05-10 18:27 采纳率: 100%
浏览 75
已结题

引用改指针怎么改啊有人吗

c语言用不了引用有人会改成指针吗,看一下简单不,帮我改一下 感激不尽

include<stdio.h>    //输入输出头文件
#include<stdlib.h>    //标准头文件
#include<string.h>    //字符串头文件
#include<stdbool.h>    //布尔类型头文件

typedef long long int Elemtype;    //该队列中的元素超长整型
typedef struct Quene* List;    //将该队列结点的指针命名为List
typedef struct LinkQuene* SqList;    //将该队列类型的指针命名为SqList
struct Quene            //定义结点
{
    Elemtype data;    //存放病历号
    List next;            //下一个结点指针
};
struct LinkQuene
{
    List front;    //指向队首结点
    List rear;    //指向队尾结点
};

bool InitQuene(SqList& q);                //初始化队列
bool DestroyQuene(SqList& q);            //销毁队列
bool QueneEmpty(SqList& q);                //判断队列是否为空
bool enQuene(SqList& q, Elemtype& e);    //进队列
bool deQuene(SqList& q, Elemtype& e);    //出队列
bool Test(SqList q);                    //病人看病模拟程序
void menu(void);                        //菜单

int main(int argc, const char* argv[])
{
    SqList q = NULL;
    bool flag = Test(q);
    if (flag)
        printf("谢谢使用,再见。\n");
    return 0;
}
bool Test(SqList q)
{
    int n;
    List p;
    bool flag = false;    //是否关闭程序,默认为“否”
    Elemtype e;
    InitQuene(q);    //创建链队
    menu();            //输出菜单
    while (scanf_s("%d", &n) != EOF) {
        switch (n) {
            case 1:printf("请输入您的病历号(不超过十位的整数):");
                scanf_s("%lld", &e);
                while (e > 1e10) {
                    printf("\n病历号不合规,重新输入:");
                    scanf_s("%lld", &e);
                }
                enQuene(q, e);    //将病历号入队
                printf("\n排队成功。\n");
                break;
            case 2:if (!QueneEmpty(q)) {
                    deQuene(q, e);    //当有人排队,即队不为空时出队
                    printf("就诊成功。\n");
                }
                else
                    printf("当前无人排队。\n");
                break;
            case 3:p = q->front;    //遍历一遍链队
                printf("排在您前面的人有:\n");
                while (p != NULL) {
                    printf("%lld\n", p->data);
                    p = p->next;
                }
                break;
            case 4:p = q->front;    //遍历一遍链队
                printf("排在您前面的人有:\n");
                while (p != NULL) {
                    printf("%lld\n", p->data);
                    p = p->next;
                }
                flag = true;
                break;
            case 5:flag = true;
                break;
            default:printf("指令错误,重新输入。\n");
        }
        if (flag)
            break;
        menu();
    }
    DestroyQuene(q);    //销毁链队
    return true;
}
void menu(void)
{
    printf("==========================\n");
    printf("=======选择您的操作=======\n");
    printf("==    1.排队            ==\n");
    printf("==    2.就诊            ==\n");
    printf("==    3.查看排队        ==\n");
    printf("==    4.不再排队        ==\n");
    printf("==    5.下班            ==\n");
    printf("==========================\n");
}
bool InitQuene(SqList& q)
{
    q = (SqList)malloc(sizeof(LinkQuene));
    //malloc有一定几率申请空间失败,此时继续申请,直到申请成功
    while (!q) {
        q = (SqList)malloc(sizeof(Quene));
    }
    q->front = q->rear = NULL;    //此时队列无元素(两个下标之间差的绝对值为0)
    return true;
}
bool DestroyQuene(SqList& q)
{
    List p;        //工作指针
    while (q->front != q->rear) {    //当队列中的结点大于一个时循环
        p = q->front;                //工作指针指向队首结点
        q->front = q->front->next;    //队首结点后移
        free(p);                    //释放掉工作指针指向的结点
    }
    p = q->front;
    free(p);    //释放掉最后一个结点
    free(q);    //释放掉链队结点
    return true;
}
bool QueneEmpty(SqList& q)
{
    return (q->front == NULL);    //当队列为空时返回“真”,否则返回“假”
}
bool enQuene(SqList& q, Elemtype& e)
{
    List p = (List)malloc(sizeof(Quene));
    //malloc有一定几率申请空间失败,此时继续申请,直到申请成功
    while (!p) {
        p = (List)malloc(sizeof(Quene));
    }
    p->data = e;
    p->next = NULL;
    if (q->rear == NULL)
        q->front = q->rear = p;    //当链队为空时,新结点既是头结点又是尾结点
    else {
        q->rear->next = p;    //将新结点接到队尾
        q->rear = p;        //队尾移动
    }
    return true;
}
bool deQuene(SqList& q, Elemtype& e)
{
    if (q->front == NULL)  //当队列为空时无法出队,返回“假”
        return false;
    List p = q->front;    //工作指针指向队首
    if (q->front == q->rear)    //当链队中只有一个结点时
        q->front = q->rear = NULL;
    else                        //当链队中有一个以上的结点时
        q->front = q->front->next;
    e = p->data;
    free(p);
    return true;
}


  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-05-10 22:35
    关注

    修改如下,见注释,供参考:

    #include<stdio.h>    //输入输出头文件
    #include<stdlib.h>    //标准头文件
    #include<string.h>    //字符串头文件
    #include<stdbool.h>    //布尔类型头文件
    
    typedef long long int Elemtype; //该队列中的元素超长整型
    typedef struct Quene* List;    //将该队列结点的指针命名为List
    typedef struct LinkQuene* SqList;    //将该队列类型的指针命名为SqList
    struct Quene            //定义结点
    {
        Elemtype data;    //存放病历号
        List next;        //下一个结点指针
    };
    struct LinkQuene
    {
        List front;    //指向队首结点
        List rear;    //指向队尾结点
    };
    
    bool InitQuene(SqList* q);                //初始化队列
    //bool InitQuene(SqList& q);
    
    bool DestroyQuene(SqList q);            //销毁队列
    //bool DestroyQuene(SqList& q);
    
    bool QueneEmpty(SqList q);              //判断队列是否为空
    //bool QueneEmpty(SqList& q);
    
    bool enQuene(SqList q, Elemtype e);    //进队列
    //bool enQuene(SqList& q, Elemtype& e);
    
    bool deQuene(SqList q, Elemtype* e);    //出队列
    //bool deQuene(SqList& q, Elemtype& e);
    
    bool Test();                  //病人看病模拟程序
    //bool Test(SqList q);
    
    void menu(void);                        //菜单
    
    int main(int argc, const char* argv[])
    {
        //SqList q = NULL;             修改
        bool flag = Test(); //Test(q); 修改
        if (flag)
            printf("谢谢使用,再见。\n");
        return 0;
    }
    bool Test() // Test(SqList q)
    {
        int n;
        SqList q = NULL;  //修改
        List p;
        bool flag = false;    //是否关闭程序,默认为“否”
        Elemtype e;
        InitQuene(&q);    //创建链队  修改
        menu();            //输出菜单
        while (scanf_s("%d", &n) != EOF) {
            switch (n) {
                case 1:printf("请输入您的病历号(不超过十位的整数):");
                    scanf_s("%lld", &e);
                    while (e > 1e10) {
                        printf("\n病历号不合规,重新输入:");
                        scanf_s("%lld", &e);
                    }
                    enQuene(q, e);    //将病历号入队
                    printf("\n排队成功。\n");
                    break;
                case 2:if (!QueneEmpty(q)) {
                        deQuene(q, &e);   //当有人排队,即队不为空时出队
                        printf("%lld 就诊成功。\n",e); //修改
                    }
                    else
                        printf("当前无人排队。\n");
                    break;
                case 3:p = q->front;    //遍历一遍链队
                    printf("排在您前面的人有:\n");
                    while (p != NULL) {
                        printf("%lld\n", p->data);
                        p = p->next;
                    }
                    break;
                case 4:p = q->front;    //遍历一遍链队
                    printf("排在您前面的人有:\n");
                    while (p != NULL) {
                        printf("%lld\n", p->data);
                        p = p->next;
                    }
                    flag = true;
                    break;
                case 5:flag = true;
                    break;
                default:printf("指令错误,重新输入。\n");
            }
            if (flag)
                break;
            menu();
        }
        DestroyQuene(q);    //销毁链队
        return true;
    }
    void menu(void)
    {
        printf("==========================\n");
        printf("=======选择您的操作=======\n");
        printf("==    1.排队            ==\n");
        printf("==    2.就诊            ==\n");
        printf("==    3.查看排队        ==\n");
        printf("==    4.不再排队        ==\n");
        printf("==    5.下班            ==\n");
        printf("==========================\n");
    }
    bool InitQuene(SqList* q)
    {
        (*q) = (SqList)malloc(sizeof(LinkQuene));        //修改
        //malloc有一定几率申请空间失败,此时继续申请,直到申请成功
        while (!(*q)) {
            (*q) = (SqList)malloc(sizeof(Quene));
        }
        (*q)->front = (*q)->rear = NULL;    //此时队列无元素(两个下标之间差的绝对值为0)
        return true;
    }
    bool DestroyQuene(SqList q) //DestroyQuene(SqList& q)
    {
        List p;        //工作指针
        while (q->front != q->rear) {    //当队列中的结点大于一个时循环
            p = q->front;                //工作指针指向队首结点
            q->front = q->front->next;    //队首结点后移
            free(p);                    //释放掉工作指针指向的结点
        }
        p = q->front;
        free(p);    //释放掉最后一个结点
        free(q);    //释放掉链队结点
        return true;
    }
    bool QueneEmpty(SqList q) //QueneEmpty(SqList& q)
    {
        return (q->front == NULL);    //当队列为空时返回“真”,否则返回“假”
    }
    bool enQuene(SqList q, Elemtype e) //enQuene(SqListz & q, Elemtype& e)
    {
        List p = (List)malloc(sizeof(Quene));
        //malloc有一定几率申请空间失败,此时继续申请,直到申请成功
        while (!p) {
            p = (List)malloc(sizeof(Quene));
        }
        p->data = e;
        p->next = NULL;
        if (q->rear == NULL)
            q->front = q->rear = p;    //当链队为空时,新结点既是头结点又是尾结点
        else {
            q->rear->next = p;    //将新结点接到队尾
            q->rear = p;        //队尾移动
        }
        return true;
    }
    bool deQuene(SqList q, Elemtype* e)  //deQuene(SqList& q, Elemtype& e)
    {
        if (q->front == NULL)  //当队列为空时无法出队,返回“假”
            return false;
        List p = q->front;    //工作指针指向队首
        if (q->front == q->rear)    //当链队中只有一个结点时
            q->front = q->rear = NULL;
        else                        //当链队中有一个以上的结点时
            q->front = q->front->next;
        (*e) = p->data;
        free(p);
        return true;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月18日
  • 已采纳回答 5月10日
  • 赞助了问题酬金5元 5月10日
  • 修改了问题 5月10日
  • 展开全部