2021-11-07 删除单链表中倒数第i个结点

【问题描述】删除单链表(带头结点,尾插入建立单链表)的倒数第i个结点,设单链表的表长大于2.

【样例输入】   

                       8

                       6  7  8  9  56 10 12  5 

                       3

【样例输出】     6  7  8  9  56  12  5 

【样例说明】第一行输入链表长度8,第二行依次输入链表元素,以空格间隔,第三行输入删除的倒数元素序列3.

                     以空格间隔依次输出删除后的单链表元素。

【运行结果如下】

 

【代码如下】

#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int ElemType;


/*线性表的单链表存储结构 */ 
typedef struct LNode{
	ElemType       data;	
	struct LNode  *next;
}LNode,*LinkList;

/*初始化链表*/
void InitList_L(LinkList &L,int n)
{
	int i;
	LinkList p,pre;
	L = (LinkList)malloc(sizeof(LNode));
	pre = L;			  //当前指针 
	for (i=0; i<n; i++){
		p = (LinkList)malloc(sizeof(LNode));
		scanf("%d",&p->data);	
		pre->next = p; 
		p->next = NULL;
		pre = pre->next;  //当前指针后移	
	} 
}

/*删除单链表的倒数第i个结点*/
void DeleteList_L(LinkList &L,int i,int n)
{
	int j = 0;
	LinkList p, q;	
	p = L;
	while (p->next && j<n-i){	//寻找第n-i个结点,并另p指向其前驱
		p = p->next;
		j++;
	}
	if(!(p->next) && j<n-i) {	//删除位置不合理 
		exit(-1);	
	}
	q = (LinkList)malloc(sizeof(LNode));
	q = p->next;
	p->next = q->next;
	free(q);
}

/*输出链表数据*/
void OutputList_L(LinkList &L){
	LinkList p;
	p = L;
	while (p->next != NULL)
	{
		p = p->next;
		printf("%d ",p->data);
	}
	printf("\n");
}

int main()
{
	LinkList L;	
	int n,i;
	scanf("%d",&n);		    //链表长度 
	InitList_L(L,n);
	scanf("%d",&i);
	DeleteList_L(L,i,n);	//删除倒数第i个结点 
 	OutputList_L(L);
	return 0;
}

本文章仅供学习和参考!

欢迎交流~

猜你喜欢

转载自blog.csdn.net/m0_58489132/article/details/121189348