这个题目是前几天一个好友分享给我的,但是因为时间原因没有及时写成文章。
这是他参加MTK笔试的题目
题目如下:
网友提供的代码如下:
#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;
}
然后,我运行了下,发现有问题
输入 5 的时候,竟然卡死在这里不动了。
我本来以为程序有问题了,后面仔细看来下,应该是中文回车和英文回车的原因。
如果修改成英文输入是没有问题的
先解释下这个程序,前面赋值就没有啥好说的了,关键是查找的位置
在脑子里面要有一个双链表的图
如果向一个双链表中插入数据,我们需要这样操作
向链表中插入数据的核心代码如下
/*找到位置,把新数据插入链表中*/
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;
}
然后之后的代码就是打印输出和释放内存了。
但是有点问题的是,因为这个题目没有题目的链接,不能直接验证写的答案是否完全正确,读者们可以看看这份代码,如果代码有问题,欢迎评论指正。
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈
关注公众号,后台回复「1024」获取学习资料网盘链接。
欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~
嵌入式Linux
微信扫描二维码,关注我的公众号