这个题目是前几天一个好友分享给我的,但是因为时间原因没有及时写成文章。
这是他参加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;
}
然后之后的代码就是打印输出和释放内存了。
但是有点问题的是,因为这个题目没有题目的链接,不能直接验证写的答案是否完全正确,读者们可以看看这份代码,如果代码有问题,欢迎评论指正。