笨鸟快飞呀 2021-12-08 00:00 采纳率: 50%
浏览 112
已结题

C语言链表插入不生效

问题遇到的现象和发生背景

插入第一次成功,但是插入第二次就报失败,不知道为什么

问题相关代码,请勿粘贴截图
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>

void menu (void);
void clear_input_queue();

typedef struct Link{
    char  *elem;
    struct Link *next;
}link;

link * initLink();
link * insertElem(link * p,char *elem,int add);
void display(link *p);

int main()
{
    menu();
    return 0;
}


void menu()
{
    // 初始化列表
    link *p=initLink();

    display(p);

    while(1){
        printf("select: a:展示全部链表, b:插入链表.\n");
        char ch;
        ch = getchar();
        
        switch(ch)
        {
            case 'a':
                printf("Then you choose show all.\n");
                display(p);  
                break;      
            case 'b':
                printf("Please enter which position you will add .\n");
                int n;
                while(scanf("%d",&n)!=1);
                {
                    while((ch=getchar())!='\n')
                        putchar(ch);
                }

                char name[50];
                gets(name);
                
                p = insertElem(p, name, n);
                display(p);
                break;
            case 'c':
                goto loop;
                break;

        }
    }
    loop:
        printf("Exit");
}

link * initLink(){
    link * p=(link*)malloc(sizeof(link)); //创建一个头结点
    link * temp=p; //声明一个指针指向头结点,用于遍历链表
    
    char *subways[] = {"第一个元素", "中间元素", "最后元素"};
    for (int i=0; i<3; i++) {
        link *a=(link*)malloc(sizeof(link));
        a->elem=subways[i];
        a->next=NULL;
        temp->next=a;
        temp=temp->next;
    }
    return p;
}

link * insertElem(link * p,char *elem,int add){
    link * temp = p;//创建临时结点temp
    link * c = NULL;
    int i = 0;
    //首先找到要插入位置的上一个结点
    for (i = 1; i < add; i++) {
        if (temp == NULL) {
            printf("插入位置无效\n");
            return p;
        }
        temp = temp->next;
    }
    c=(link*)malloc(sizeof(link));
    strcpy(c->elem,elem);
    // c->elem = tmp;
    c->next = temp->next;
    temp->next = c;
    return  p;
}


void display(link *p){
    link* temp=p; //将temp指针重新指向头结点
    //只要temp指针指向的结点的next不是Null,就执行输出语句。
    while (temp->next) {
        temp=temp->next;
        char *data = temp->elem;
        for (int i=0; i < strlen(data); i++){
            printf("%c",data[i]);
        }
        if (temp->next)
            printf(" --- ");
    }
    printf("\n");
}

运行结果及报错内容
第一个元素 --- 中间元素 --- 最后元素
select: a:展示全部链表, b:插入链表.
a
Then you choose show all.
第一个元素 --- 中间元素 --- 最后元素
select: a:展示全部链表, b:插入链表.    // 这里为啥显示两遍??
select: a:展示全部链表, b:插入链表.
b
Please enter which position you will add .
2       // 插入位置
元素1    // 插入元素
第一个元素 --- 元素1 --- 中间元素 --- 最后元素
select: a:展示全部链表, b:插入链表.
b
Please enter which position you will add .
2
元素2     //  后面就没了,退出程序了
我的解答思路和尝试过的方法
我想要达到的结果

正常插入

  • 写回答

3条回答 默认 最新

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 系统已结题 12月17日
      • 已采纳回答 12月9日
      • 创建了问题 12月8日

      悬赏问题

      • ¥20 python跨服务器实现复制 ,剪切的功能需求
      • ¥15 android sqlite数据库如何读取显示数据(语言-java)
      • ¥15 R语言,单因素cox检验,时间分层后,使用coz.zph()函数再次ph假设检验时报错,如何解决?
      • ¥15 关于#C语言冒泡排序型#的问题,如何解决?
      • ¥15 如何预处理存在负值的样本数据,使其能够全都成为正的
      • ¥15 SW画图拖影,平滑处理如何关闭
      • ¥15 请问怎么通过css改变图片颜色
      • ¥15 Blender: auto rig pro骨骼动画导出后变形穿模
      • ¥15 C51单片机的设计思路哈
      • ¥15 Linux脏牛提权漏洞