描述:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。

问题遇到的现象和发生背景

在输出完所有小于X的节点后会莫名其妙打印一个地址。

问题相关代码,请勿粘贴截图

#include
#include <stdlib.h>
#define MaxSize 10
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}LinkNode;

void InitList(LinkNode *&L)
{
L=(LinkNode *)malloc(sizeof(LinkNode));
if(L==NULL)
{
printf("内存分配失败!!\n");
exit(0);
}
L->next==NULL;

}
void creatList(LinkNode *&L,ElemType a,int n)//n为索要创建的元素个数, 尾插法
{
int i;
LinkNode *s,*r;
r=L;//r为尾指针
for(i=0;i<n;i++)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a;
r->next=s;
r=s;
}
r->next=NULL;
}
void printlist(LinkNode &L)
{
struct Node
pmove=L->next;
while(pmove)
{
printf("%d\t",pmove->data);
pmove=pmove->next;
}
printf("\n");
}
bool InsertNode(LinkNode *&L,ElemType i,ElemType a)//i为要插入的位置,a为要插入的元素
{
int j=0;
LinkNode *pmove=L;//遍历指针
LinkNode *newNode;
if(i<1)
{
return false;
}
while(j<i-1&&pmove!=NULL)
{
pmove=pmove->next;
j++;
}
if(pmove==NULL)
{
printf("无法插入,位置溢出\n");
}
newNode=(LinkNode *)malloc(sizeof(LinkNode));
newNode->data=a;
newNode->next=pmove->next;
pmove->next=newNode;
printf("插入成功\n");
return true;
}
bool ListDelete(LinkNode * &L,int i){
int j = 0;
LinkNode *p=L,*q;
if(i<1){
printf("i值错误\n");
return false;
}
while(j<i-1 && p!=NULL){
j++;
p=p->next;
}
if(p == NULL){ //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
//没发现第i-1个结点
printf("不存在这个结点\n");
return(false);
}
q=p->next; //q指向第i个结点
if(q == NULL){ //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
//没发现第i个结点
printf("不存在这个结点\n");
return(false);
}
p->next=q->next; //第i-1个结点p接到第i+1个结点
free(q);
printf("删除成功!!\n");
return(true);
}
//释放单链表
void DestoryList(LinkNode * &L){
LinkNode *p=L; //从头指针开始释放,p用来释放指针
LinkNode *s=p->next; //s用来保存下一个结点地址
while(s != NULL){
free(p);
p=s;
s=p->next;
}
free(p);
}
LinkNode partition(LinkNode &L, int x) {
LinkNode
small = (LinkNode )malloc(sizeof( LinkNode));
LinkNode
smallHead = small;
LinkNode
large =(LinkNode ) malloc(sizeof( LinkNode));
LinkNode
largeHead = large;
while (L != NULL) {
if (L->data < x) {
small->next = L;
small = small->next;
} else {
large->next = L;
large = large->next;
}
L = L->next;
}
large->next = NULL;
small->next = largeHead->next;
return smallHead;
}

int main()
{
LinkNode *L;
ElemType a,b,c;
InitList(L);
printf("请输入要插入的元素及个数:\n");
scanf("%d %d",&a,&b);
creatList(L,a,b);
InsertNode(L,2,3);
printlist(L);
printf("请输入你要删除的位置:\n");
scanf("%d",&c);
ListDelete(L,c);
printlist(L);
printf("交换后:\n");
LinkNode *p=partition(L,3);
printlist(p);

}

运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果

partition函数里,应该是从L->next开始,不是从L开始。
修改后运行结果:

img

代码修改如下:(主要是修改的partition函数,DestoryList函数也调整了一下,但是你代码中没调用,没什么影响)



#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElemType;
typedef struct Node
{
    ElemType data;
    struct Node* next;
}LinkNode;

void InitList(LinkNode*& L)
{
    L = (LinkNode*)malloc(sizeof(LinkNode));
    if (L == NULL)
    {
        printf("内存分配失败!!\n");
        exit(0);
    }
    L->next == NULL;

}
void creatList(LinkNode*& L, ElemType a, int n)//n为索要创建的元素个数, 尾插法
{
    int i;
    LinkNode* s, * r;
    r = L;//r为尾指针
    for (i = 0; i < n; i++)
    {
        s = (LinkNode*)malloc(sizeof(LinkNode));
        s->data = a;
        r->next = s;
        r = s;
    }
    r->next = NULL;
}
void printlist(LinkNode* & L)
{
    struct Node *pmove = L->next;
    while (pmove)
    {
        printf("%d\t", pmove->data);
        pmove = pmove->next;
    }
    printf("\n");
}
bool InsertNode(LinkNode*& L, ElemType i, ElemType a)//i为要插入的位置,a为要插入的元素
{
    int j = 0;
    LinkNode* pmove = L;//遍历指针
    LinkNode* newNode;
    if (i < 1)
    {
        return false;
    }
    while (j < i - 1 && pmove != NULL)
    {
        pmove = pmove->next;
        j++;
    }
    if (pmove == NULL)
    {
        printf("无法插入,位置溢出\n");
    }
    newNode = (LinkNode*)malloc(sizeof(LinkNode));
    newNode->data = a;
    newNode->next = pmove->next;
    pmove->next = newNode;
    printf("插入成功\n");
    return true;
}
bool ListDelete(LinkNode*& L, int i) {
    int j = 0;
    LinkNode* p = L, * q;
    if (i < 1) {
        printf("i值错误\n");
        return false;
    }
    while (j < i - 1 && p != NULL) {
        j++;
        p = p->next;
    }
    if (p == NULL) { //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
    //没发现第i-1个结点
        printf("不存在这个结点\n");
        return(false);
    }
    q = p->next; //q指向第i个结点
    if (q == NULL) { //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
    //没发现第i个结点
        printf("不存在这个结点\n");
        return(false);
    }
    p->next = q->next; //第i-1个结点p接到第i+1个结点
    free(q);
    printf("删除成功!!\n");
    return(true);
}
//释放单链表
void DestoryList(LinkNode*& L) {
    LinkNode* p = L; //从头指针开始释放,p用来释放指针
    LinkNode* s;// = p->next; //s用来保存下一个结点地址
    while (p != NULL) {
        s = p->next;
        free(p);
        p = s;
    }
    L = 0;
}
LinkNode* partition(LinkNode*& L, int x) {
    LinkNode* small = (LinkNode*)malloc(sizeof(LinkNode));
    LinkNode* smallHead = small;
    LinkNode* large = (LinkNode*)malloc(sizeof(LinkNode));
    LinkNode* largeHead = large;
    LinkNode* pp = L->next;
    while (pp != NULL) {
        if (pp->data < x) {
            small->next = pp;
            small = small->next;
        }
        else {
            large->next = pp;
            large = large->next;
        }
        pp = pp->next;
    }
    large->next = NULL;
    small->next = largeHead->next;
    return smallHead;
}

int main()
{
    LinkNode* L;
    ElemType a, b, c;
    InitList(L);
    printf("请输入要插入的元素及个数:\n");
    scanf("%d %d", &a, &b);
    creatList(L, a, b);
    InsertNode(L, 2, 3);
    printlist(L);
    printf("请输入你要删除的位置:\n");
    scanf("%d", &c);
    ListDelete(L, c);
    printlist(L);
    printf("交换后:\n");
    LinkNode* p = partition(L, 3);
    printlist(p);

}

添加//*******************************的地方是我改动的地方


#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElemType;
typedef struct Node
{
    ElemType data;
    struct Node* next;
}LinkNode;

void InitList(LinkNode*& L)
{
    L = (LinkNode*)malloc(sizeof(LinkNode));
    if (L == NULL)
    {
        printf("内存分配失败!!\n");
        exit(0);
    }
    L->next = NULL;//*******************************

}
void creatList(LinkNode*& L, ElemType a, int n)//n为索要创建的元素个数, 尾插法
{
    int i;
    LinkNode* s, * r;
    r = L;//r为尾指针
    for (i = 0; i < n; i++)
    {
        s = (LinkNode*)malloc(sizeof(LinkNode));
        s->data = a;
        r->next = s;
        r = s;
    }
    r->next = NULL;
}
void printlist(LinkNode& L)
{
    struct Node* pmove = L.next;//*******************************
    while (pmove)
    {
        printf("%d\t", pmove->data);
        pmove = pmove->next;
    }
    printf("\n");
}
bool InsertNode(LinkNode*& L, ElemType i, ElemType a)//i为要插入的位置,a为要插入的元素
{
    int j = 0;
    LinkNode* pmove = L;//遍历指针
    LinkNode* newNode;
    if (i < 1)
    {
        return false;
    }
    while (j < i - 1 && pmove != NULL)
    {
        pmove = pmove->next;
        j++;
    }
    if (pmove == NULL)
    {
        printf("无法插入,位置溢出\n");
    }
    newNode = (LinkNode*)malloc(sizeof(LinkNode));
    newNode->data = a;
    newNode->next = pmove->next;
    pmove->next = newNode;
    printf("插入成功\n");
    return true;
}
bool ListDelete(LinkNode*& L, int i) {
    int j = 0;
    LinkNode* p = L, * q;
    if (i < 1) {
        printf("i值错误\n");
        return false;
    }
    while (j < i - 1 && p != NULL) {
        j++;
        p = p->next;
    }
    if (p == NULL) { //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
    //没发现第i-1个结点
        printf("不存在这个结点\n");
        return(false);
    }
    q = p->next; //q指向第i个结点
    if (q == NULL) { //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
    //没发现第i个结点
        printf("不存在这个结点\n");
        return(false);
    }
    p->next = q->next; //第i-1个结点p接到第i+1个结点
    free(q);
    printf("删除成功!!\n");
    return(true);
}
//释放单链表
void DestoryList(LinkNode*& L) {
    LinkNode* p = L; //从头指针开始释放,p用来释放指针
    LinkNode* s = p->next; //s用来保存下一个结点地址
    while (s != NULL) {
        free(p);
        p = s;
        s = p->next;
    }
    free(p);
}
LinkNode* partition(LinkNode& L, int x) {
    LinkNode* small = (LinkNode*)malloc(sizeof(LinkNode));//*******************************
    LinkNode* smallHead = small;;//*******************************
    LinkNode* large = (LinkNode*)malloc(sizeof(LinkNode));;//*******************************
    LinkNode* largeHead = large;;//*******************************
    LinkNode* pNode = L.next;;//*******************************
    while (pNode != NULL) {
        if (pNode->data < x) {
            small->next = pNode;
            small = small->next;
        }
        else {
            large->next = pNode;
            large = large->next;
        }
        pNode = pNode->next;
    }
    large->next = NULL;
    small->next = largeHead->next;
    return smallHead;
}

int main()
{
    LinkNode* L;
    ElemType a, b, c;
    InitList(L);
    printf("请输入要插入的元素及个数:\n");
    scanf("%d %d", &a, &b);
    creatList(L, a, b);
    InsertNode(L, 2, 3);
    printlist(*L);
    printf("请输入你要删除的位置:\n");
    scanf("%d", &c);
    ListDelete(L, c);
    printlist(*L);
    printf("交换后:\n");
    LinkNode* p = partition(*L, 3);
    printlist(*p);

}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632