【问题描述】删除单链表(带头结点,尾插入建立单链表)的倒数第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;
}
本文章仅供学习和参考!
欢迎交流~