BAPPS 2022-11-02 22:51 采纳率: 87%
浏览 26
已结题

最后一个最小值结点移到表头

将一个带头结点的非空循环单链表L中最后一个最小值结点移到表头。
请问为什么运行不起来?
#include<stdio.h>
#include<malloc.h>

typedef struct node{
int data;
struct node* next;
}node;

node *creat(int length){ // 创建循环单链表
node p;
printf("Input %d data:",length);
int n;
if(length<1)
return NULL;
node* head=(node*)malloc(sizeof(node));
head->next=NULL;
int i=1;
node
temp=head;
while(i<=length){
p=(node*)malloc(sizeof(node));
scanf("%d",&n);
p->data=n;
temp->next=p;
temp=p;
i++;
}
temp->next=head->next; // 唯一和单链表创建有区别的地方
return head;
}

void print(nodeL,int n){ // 输出链表元素
node
p=L->next;
if(p==NULL){
printf("链表元素为空!");
return ;
}
int i;
for(i=0;i<n;i++){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}

void Move(node*L,int n)
{
node *p=L->next,*pre=L;
node *minp=p,*minpre=L;
while(p!=L)
{
if (p->data<=minp->data)
{
minp=p;
minpre=pre;
}
pre=p;//pre、p同步后移
p=p->next;
}
minpre->next=minp->next;//删除minp结点
minp->next=L->next;//将minp结点插入到头结点之后
L->next=minp;
}

int main(){
node* L;
int m,n;
printf("Input n:");
scanf("%d",&n);
L=creat(n);
m=Move(L);
print(L,n);
print(L,n+1);
}

  • 写回答

1条回答 默认 最新

  • 伍六七0804 2022-11-03 09:45
    关注

    兄弟你这个问题是不是问过一次了。
    问题在create最后面应该是
    temp->next = head;

    
    #include <stdio.h>
    #include <malloc.h>
    
    typedef struct node
    {
        int data;
        struct node *next;
    } node;
    
    node *creat(int length)
    { // 创建循环单链表
        node * p;
        printf("Input %d data:", length);
        int n;
        if (length < 1)
            return NULL;
        node *head = (node *)malloc(sizeof(node));
        head->next = NULL;
        int i = 1;
        node * temp = head;
        while (i <= length)
        {
            p = (node *)malloc(sizeof(node));
            scanf("%d", &n);
            p->data = n;
            temp->next = p;
            temp = p;
            i++;
        }
        temp->next = head; // 唯一和单链表创建有区别的地方
        return head;
    }
    
    void print(node * L, int n)
    { // 输出链表元素
        node * p = L->next;
        if (p == NULL)
        {
            printf("链表元素为空!");
            return;
        }
        int i;
        for (i = 0; i < n; i++)
        {
            printf("%d ", p->data);
            p = p->next;
        }
        printf("\n");
    }
    
    void Move(node *L, int n)
    {
        node *p = L->next, *pre = L;
        node *minp = p, *minpre = L;
        while (p != L)
        {
            if (p->data <= minp->data)
            {
                minp = p;
                minpre = pre;
            }
            pre = p; // pre、p同步后移
            p = p->next;
        }
        minpre->next = minp->next; // 删除minp结点
        minp->next = L->next;      // 将minp结点插入到头结点之后
        L->next = minp;
    }
    
    int main()
    {
        node *L;
        int m, n;
        printf("Input n:");
        scanf("%d", &n);
        L = creat(n);
        Move(L, n);
        print(L, n);
        print(L, n + 1);
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月11日
  • 已采纳回答 11月3日
  • 创建了问题 11月2日

悬赏问题

  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题