ZhKuStu 2022-03-31 12:54 采纳率: 66.7%
浏览 81
已结题

描述:给你一个链表的头节点 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

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

3条回答 默认 最新

  • 关注

    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);
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 创建了问题 3月31日

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。