无头节点的单循环链表中删除指针s所指结点的前驱结点

#include <stdio.h>
typedef int ElemType;
typedef struct
{
	ElemType data;
	struct LNode *next;
}LNode, *CLinkList;

void initLink(CLinkList L);//初始化头节点
void createLink(CLinkList L, ElemType *arr, int n);//用长度为n的数组创建链表
void showList(CLinkList L);//输出指定节点之后的所有节点

//返回L后第n个节点(n可超过L的总节点个数)
LNode *creLNodePoint(CLinkList L, int n);
//删除s的前驱节点
void delPrior(LNode *s);

int main()
{
	ElemType data[6] = {1, 2, 3, 8, 4, 5 };
	int length = sizeof(data) / sizeof(ElemType);
	CLinkList L = (CLinkList)malloc(sizeof(CLinkList));
	LNode *s;

	initLink(L);
	createLink(L, data, length);
	printf("原链表:\t\t");
	showList(L);

	s = creLNodePoint(L,4);//制作指向循环链表某节点的指针
	delPrior(s);//删除s的前驱节点
	printf("s指向的数据为%d\n",*s);
	printf("删除其前驱节点:\t");
	showList(L);
	
	getchar();
	return 0;
}


void initLink(CLinkList L)
{
	L->data = 0;
	L->next = L;
}

void createLink(CLinkList L, ElemType *arr, int n)
{
	LNode *node = NULL;
	LNode *r = L;
	int i;
	r->data = arr[0];
	for (i = 1; i < n; i++){
		node = (LNode *)malloc(sizeof(LNode));
		node->data = arr[i];
		node->next = r->next;
		r->next = node;
		r = r->next;
	}
}

void showList(CLinkList L)
{
	int i;
	LNode *r = L;
	while (r->next != L){
		printf("%d ", r->data);
		r = r->next;
	}
	printf("%d ", r->data);
	printf("\n");
}

//返回L后第n个节点(n可超过L的总节点个数)
LNode *creLNodePoint(CLinkList L, int n)
{
	LNode *s = L;
	while (n--)
	{
		s = s->next;
	}
	return s;
}

//删除s的前驱节点
void delPrior(LNode *s)
{
	LNode *p = s;
	LNode *r = p;
	while (p->next != s)
	{
		r = p;
		p = p->next;
	}
	r->next = s;
	free(p);
}

  • 13
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值