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


单链表增加删除


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 -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不为空,,是正常的插入操作

综上,这里就是要注意一个边界条件的判断,大家平常做题使,一定要注意边界条件的判断,这个很重要,因为到时面试的时候,可是要手撕代码,并且要求考虑到所有的边界情况

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

上一篇:数据结构(严蔚敏)2.3.1线性链表


下一篇:2021-09-04