hantang1147 2021-04-20 09:38
浏览 44

以给定x为基准将单链表(以-1结尾)分割成两行,所有小于x的节点排在大于或等于x的结点之前。

#include <malloc.h>
#include<stdio.h>
typedef struct LNode {
	int data;
	struct LNode* next;
}LNode,*LinkList;
LinkList List_Taillnsert(LinkList& L) {         //申请一个单链表并输入数据
	int x;
	L = (LinkList)malloc(sizeof(LNode));
	LNode* s, * r = L;
	scanf_s("%d", &x);
	while (x != -1) {
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		scanf_s("%d", &x);
	}
	r->next = NULL;
	return L;
}
bool DispList(LNode* L)		
{
	LNode* p = L->next;
	while (p) {
		printf("\t%d", p->data);
		p = p->next;
	}
	printf("\n");
	return true;
}
bool DivideList(LNode*& L, int x)	//L为传入的链表头结点,x为传入的基准
{
	LNode* p = NULL, * q = NULL, * r = NULL;	//p为工作指针,q为小于基准的数的头结点,r为尾指针
	p = L;
	//直到申请成功,因为malloc可能申请失败
	while (!q) {
		q = (LNode*)malloc(sizeof(LNode));
	}
	r = q;	//r指向小于基准的链表的尾巴
	//p从第一个有效结点开始扫描整个链表,直到p后无结点为空
	while (p->next) {
		if (p->next->data < x) {
			r->next = p->next;		//将p接到尾巴后面
			r = r->next;				//尾巴后移
			p->next = p->next->next;	//将该结点从L中截取出去
			r->next = NULL;			//将尾巴与原链表之间的关系切断
		}
		else
			p = p->next;			//p后移
	}
	//将小于基准的链表接到大于等于基准的链表的前面
	//r->next = L->next;	//小于基准的链表的尾巴与大于等于基准的链表相连
	//L->next = q->next;	//将整体接到头结点后
	//free(q);			//释放小于基准的链表的头结点
	printf("L:", &r);
	printf("Q:", &q);
	return true;
}
int main(int argc, const char* argv[])
{
	LNode* L = NULL;
	int x;
	bool flag = false;
	LinkList List_Taillnsert(L);
	printf("请输入基准。\n");
	scanf_s("%d", &x);
	flag = DivideList(L, x);
	if (flag)
		printf("算法执行成功。\n");
	else
		printf("算法执行失败。\n");
	DispList(L);
	return 0;
}

这里面为什么p会一直是null,应该怎么修改啊

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
    • ¥20 软件测试决策法疑问求解答
    • ¥15 win11 23H2删除推荐的项目,支持注册表等
    • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
    • ¥15 qt6.6.3 基于百度云的语音识别 不会改
    • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
    • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
    • ¥15 lingo18勾选global solver求解使用的算法
    • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
    • ¥20 测距传感器数据手册i2c