Ggzy_ 2021-10-27 07:50 采纳率: 66.7%
浏览 41
已结题

这段代码为什么一直循环啊


//C语言构建链表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stud_node {
    int num;
    char name[20];
    int score;
    struct stud_node* next;
};
struct stud_node* Create_Stu_Doc();//新建链表
struct stud_node* InsrtDoc(struct stud_node* head, struct stud_node* stud);//插入
struct stud_node* DeleteDoc(struct stud_node* head, int num);//删除
void Print_stu_Doc(struct stud_node* head);//遍历
int main()
{
    struct stud_node* head, * p;
    int choice, num, score;
    char name[20] = {0};
    head = NULL;
    int size = sizeof(struct stud_node);

    do {
        printf("1:create 2:insert 3:delete 4:print 0:exit\n");
        scanf_s("%d", &choice);
        switch (choice) {
        case 1:
            head= Create_Stu_Doc();
            break;
        case 2:
            printf("Input num,name and score:\n");
            scanf_s("%d%s%d",&num,name,20,&score);
            p = (struct stud_node*)malloc(size);
            if (p == NULL)
                printf("内存分配不成功\n");
            else
            {
                p->num = num;
                strcpy_s(p->name, 20, name);
                p->score = score;
                head = InsrtDoc(head, p);
            }
            break;
        case 3:
            printf("Input num:\n");
            scanf_s("%d", &num);
            head = DeleteDoc(head, num);
            break;
        case 4:
            Print_stu_Doc(head);
            break;
        case 0:
            break;
        }
    } while (choice != 0);

    return 0;
}
//新建链表
struct stud_node* Create_Stu_Doc()
{
    struct stud_node* head, * p;
    int num, score;
    char name[20] = {0};
    int size = sizeof(struct stud_node);

    head = NULL;
    printf("Input num,name and score:\n");
    scanf_s("%d%s%d",&num,name,20,&score);
    while (num != 0)
    {
        p = (struct stud_node*)malloc(size);
        if (p == NULL)
            printf("内存分配不成功\n");
        else
        {
            p->num = num;
            strcpy_s(p->name, 20, name);
            p->score = score;
        }
        head = InsrtDoc(head, p);     //调用插入函数
        scanf_s("%d%s%d", &num, name,20, &score);
    }
    return head;
}
//插入
struct stud_node* InsrtDoc(struct stud_node* head, struct stud_node* stud)
{
    struct stud_node* ptr, * ptr1, * ptr2;
    ptr2 = head;
    ptr = stud;
    if (head == NULL)
    {
        head = ptr;
        head->next = NULL;
    }
    else{
        while ((ptr->num > ptr2->num) && (ptr2->next != NULL)) {
            ptr1 = ptr2;
            ptr2 = ptr2->next;
        }
        if (ptr->num <= ptr2->num) {
            if (head == ptr2) head = ptr;
            else ptr1->next = ptr;
            ptr->next = ptr2;
        }
        else {
            ptr2->next = ptr;
            ptr->next = NULL;
        }
    }
    return head;
}
//删除
struct stud_node* DeleteDoc(struct stud_node* head, int num)
{
    struct stud_node * ptr1, * ptr2;
    while (head != NULL && head->num == num) {
        ptr2 = head;
        head = head->next;
        free(ptr2);
    }
    if (head == NULL)
        return NULL;
    ptr1 = head;
    ptr2 = head->next;
    while (ptr2 != NULL) {
        if (ptr2->num == num) {
            ptr1->next = ptr2->next;
            free(ptr2);
        }
        else
        ptr1 = ptr2;
        ptr2 = ptr1->next;
    }
    return head;
}
//遍历
void Print_stu_Doc(struct stud_node* head)
{
    struct stud_node*ptr;
    if (head == NULL)
    {
        printf("\nNo Records\n");
        return;
    }
    printf("\nThe Students'Records Are:\n");
    printf("num\tname\tscore\n");
    for(ptr=head;ptr!=NULL;ptr=ptr->next)
        printf(" %d\t%s\t%d\n",ptr->num, ptr->name, ptr->score);
}
  • 写回答

1条回答 默认 最新

  • J_KILL_P 2021-10-27 08:37
    关注

    用了do……while循环,每一次循环输入choice值进行判断是选择功能还是退出循环,想要退出循环需要根据while后面括号的值,题主while(choice!=0),也就是说只要choice不等于0就会一直循环,想要退出循环输入0即可。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月4日
  • 已采纳回答 10月27日
  • 创建了问题 10月27日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵