1.节点插入
题目来源于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 -1
2
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不为空,,是正常的插入操作
综上,这里就是要注意一个边界条件的判断,大家平常做题使,一定要注意边界条件的判断,这个很重要,因为到时面试的时候,可是要手撕代码,并且要求考虑到所有的边界情况
2.节点删除
通插入操作类似,也是要注意边界条件的取值,这里的代码与插入不同,边界判断也就有点不同,不过是同样的思想
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