这个题目是前几天一个好友分享给我的,但是因为时间原因没有及时写成文章。

这是他参加MTK笔试的题目

题目如下:

MTK笔试1题~_链表

网友提供的代码如下:

#include "stdio.h"

typedef struct n{
    int data;
    struct n* next;
    struct n* pre;
}*pnode;


int main(){

    pnode head = (pnode)malloc(sizeof(struct n) );
    pnode preNode = head ;

    int tmpVal;
    while(1){

        scanf("%d",&tmpVal);

        pnode node = (pnode)malloc(sizeof(struct n));
        node->data = tmpVal;
        node->next = NULL;
        node->pre = preNode;
        preNode->next = node;
        preNode = node;


        if(getchar() == '\n'){
            break;
        }


    }

    int willbeadd;
    scanf("%d",&willbeadd);
    pnode addNode = (pnode)malloc(sizeof(struct n));
    addNode->data = willbeadd;
 // 这两行一开始没写,怀疑是第一个测试用例卡在这了
    addNode->next = NULL;
    addNode->pre = NULL;

    pnode cur = head->next;
    pnode pre02 = head;
    while(cur != NULL && cur->data < addNode->data){
        pre02 = pre02->next;
        cur = cur->next;
    }

    if(cur != NULL){
        addNode->next = cur;
        addNode->pre = pre02;
        cur->pre = addNode;
        pre02->next = addNode;
    }else{
        pre02->next = addNode;
        addNode->pre = pre02;
    }



    cur = head->next;
    while(cur->next != NULL){
        printf("%d ",cur->data);
        cur = cur->next;
    }
    printf("%d",cur->data);

    cur = head;
    pnode nextNode = cur->next;
    while(cur != NULL){
        free(cur);
        cur = nextNode;
        if(nextNode != NULL){
            nextNode = nextNode->next;
        }
    }

    return 0;
}

然后,我运行了下,发现有问题

MTK笔试1题~_软件开发_02

输入 5 的时候,竟然卡死在这里不动了。

我本来以为程序有问题了,后面仔细看来下,应该是中文回车和英文回车的原因。

MTK笔试1题~_软件开发_03

如果修改成英文输入是没有问题的

MTK笔试1题~_数据可视化_04

先解释下这个程序,前面赋值就没有啥好说的了,关键是查找的位置

在脑子里面要有一个双链表的图

MTK笔试1题~_软件开发_05

如果向一个双链表中插入数据,我们需要这样操作

MTK笔试1题~_软件开发_06

向链表中插入数据的核心代码如下

/*找到位置,把新数据插入链表中*/
while(cur != NULL && cur->data < addNode->data){
    pre02 = pre02->next;
    cur = cur->next;
}

if(cur != NULL){/*如果找到的位置在中间*/
    addNode->next = cur;
    addNode->pre = pre02;
    cur->pre = addNode;
    pre02->next = addNode;
}else{/*如果位置在双向链表的最后面*/
    pre02->next = addNode;
    addNode->pre = pre02;
}

然后之后的代码就是打印输出和释放内存了。

但是有点问题的是,因为这个题目没有题目的链接,不能直接验证写的答案是否完全正确,读者们可以看看这份代码,如果代码有问题,欢迎评论指正。


 

 

MTK笔试1题~_链表_07