题目来源于PTA
本题要求实现带头结点的单链表插入操作,插入成功返回1,否则返回0。 函数接口定义:int insert_link ( LinkList L,int i,ElemType e);L是单链表的头指针,i为插入位置,e是插入的数据元素,插入成功返回1,否则返回0。 裁判测试程序样例:#include <stdio.h>#include <stdlib.h>typedef int ElemType;typedef struct LNode{ ElemType data;struct LNode *next;}LNode,*LinkList;LinkList Create();/* 细节在此不表 */void print( LinkList L);int insert_link ( LinkList L,int i,ElemType e);int main(){int position,insert_data;int flag; LinkList L = Create();scanf("%d",&position);scanf("%d",&insert_data); flag=insert_link(L,position,insert_data);if(flag) {print(L);}else { printf("Wrong Position for Insertion");}return 0;}void print(LinkList L){ LinkList p; p=L->next;while (p){ printf("%d ", p->data); p =p->next;}}/* 请在这里填写答案 */输入格式: 输入数据为三行,第一行是若干正整数,最后以-1表示结尾(-1不算在序列内,不要处理)。所有数据之间用空格分隔。 第二行数据是插入位置,第三行数据是被插入元素值。 输入样例:1 2 3 4 5 6 -12 100输出样例:1 100 2 3 4 5 6
正解
int insert_link ( LinkList L,int i,ElemType e){ int j=0; LinkList head=L; if(i<=0) return 0; [while循环是为了遍历到要插入节点的前一个节点]while(head&&j<i-1){head= head->next;++j;} LinkList temp=(LinkList)malloc(sizeof(LNode)); if(!temp) return 0; //判断head是否为空 if(!head) return 0; temp->data=e; temp->next=head->next; head->next=temp; return 1;}
注意这里判断head是否为空很重要,少了这个条件会显示段错误
因为跳出while循环有两种情况
1,就是当head为空的情况,即遍历到了尾结点,此时head为NULL,然而j还没有到达i-1 这说明是,你要插入的节点在尾结点后面至少两个位置,也就是说,当head都已经为空了,然而j还没有到达要插入节点的前一个位置,所以下面需要单独用if判断head是否为空,如果为空,则插入失败
2 就是j到达i-1,正常退出,此时head不为空,,是正常的插入操作
综上,这里就是要注意一个边界条件的判断,大家平常做题使,一定要注意边界条件的判断,这个很重要,因为到时面试的时候,可是要手撕代码,并且要求考虑到所有的边界情况
通插入操作类似,也是要注意边界条件的取值,这里的代码与插入不同,边界判断也就有点不同,不过是同样的思想
int j=1;LinkList p=L;LinkList temp;if(i<=0) return 0;while(j<i&&p->next){p=p->next;j++;}if(!(p->next)) return 0;temp=p->next;p->next=temp->next;free(temp);return 1;}
这里要注意的就是
if(!(p->next)) return 0;
这个边界条件,因为我删除操作使用的是while(p->next),所以判断也就是p->next