(含头结点)单链表的节点删除,增加---最易犯错!!!

单链表增加删除

    • 1.节点插入
      • 2.节点删除

1.节点插入

题目来源于PTA
本题要求实现带头结点的单链表插入操作,插入成功返回1,否则返回0。

函数接口定义:
int insert_link ( LinkList L,int i,ElemType e);
L是单链表的头指针,i为插入位置,e是插入的数据元素,插入成功返回1,否则返回0。

裁判测试程序样例:
#include 
#include 

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

你可能感兴趣的:(数据结构与算法,单链表,链表,数据结构,算法)