0$房天下问答|不带头结点的单链表插入函数纠错$https://m.fang.com/ask/ask_1799757.html$https://static.soufunimg.com/common_m/m_public/201511/images/asksharedefault.png
packc/pages/ask/detail/detail?askid=1799757
-
不带头结点的单链表插入函数纠错
typedef struct node{ ElemType data; struct node * next;}SNode;insert(SNode *head,int i,ElemType x)/*head为第1个结点,i为插到第i个结点之前,x是插入的data值*/{ SNode *p,*q; int j=1; p=(SNode *)malloc(sizeof(SNode)); p->data=x; q=head; while(q && j<i-1) { q=q->next;j++ } if((q==NULL && j<i-1) || i<1) return 0;/*插入不成功*/ else{ if(q==NULL || q==head)/*插入结点到空表或第一个结点前*/ { p->next=q->next;q=p; } else{ p->next=q->next; q->next=p; } return 1;/*插入成功*/ }}我感觉,当i赋给它2(想插入到第2结点之前),且head==NULL(但是表是空表)的情况时有问题,需要的效果应该是插入失败的,但看这函数意思会执行插入到第1结点前;还有当j=i-2成功循环后q==NULL的情况(即第i-1个结点是NULL,即链表只到i-2),如此情况下插入应该也是失败的,但是照此函数运行的话,会做插入第1结点前的操作1。首先我想让大家判断下我认为的2个错误情况设想的对不对,如果我设想的不对,稍微详细的说下我这2个情况下的执行步骤;2。如果我说的这2个情况正是如此的话,那这函数该怎么改才能正确无漏洞的判断各种情况。我也知道这问题很搞脑子,献上100分给大家~~希望有人能够详细分析且回答出这个问题,感激万分~~~
更多
提问者:ww1476946145
发布于2011-01-18
共1个回答
-
-
-
Agood
丨Lv 3
这样做试试:先判断并处理插入位置为1的特殊情况,也就是插入的点会成为新的头结点。再用指针q依次向后,停在第i个位置上,并在i-1的位置上用指针r定位。接下来,就是在指针r与指针q之间插入新的结点了,这里用指针p指向要插入的新节点。最后,如果q一直到了 null,j仍小于i,说明位置参数i过大,插入失败。int insert(SNode *head,int i,ElemType x){ SNode *p,*q,*r; int j=1; q=head; p=(SNode *)malloc(sizeof(SNode)); p->data=x; /* 特殊情况:插入点为新的头结点 的情况 */ if (i == 1) { p->next = head; /* 新点p的next指向原head */ head = p; /* head指向新点p */ return 1; } /* 依次查找结点以定位,跳出while循环后的状态:j=i,q指向第i个结点 */ while (q->next != null && j < i) { r = q; /* 第i个结点的前一点,用指针r记录备用 */ q = q->next; ++j; } /* 插入操作,q指向第i点,r指向i-1点,p插入在r与q之间 */ if (j == i) { p->next = q; r->next = p; return 1; } return 0; /* q->next一直到null时j仍小于i,插入失败 */}
免责声明:问答内容均来源于互联网用户,房天下对其内容不负责任,如有版权或其他问题可以联系房天下进行删除。

关注成功