#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,应该怎么修改啊