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

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

设计一个算法,将一个带头结点的非空循环单链表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:41
    关注

    问题出在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日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装