c语言实现单链表随机生成数,并求出最小值,求解决

输出数字出错,自动结束

img

代码如下:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>


#define ERROR 0

typedef int ELemType;
typedef struct Node
{
    ELemType data;
    struct Node *next ;
}Node ;
typedef struct Node *LinkList;

void CreateListHead(LinkList *L , int n )
{
    LinkList p ;
    int i ;
    srand(time(0));  //初始化随机种子
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;        //建立带头结点的链表
    for(i = 0 ; i < n ;i++ )
    {
        p = (LinkList)malloc(sizeof(Node));
        p->data = rand()%10+1;        //随机生成100以内数
        p->next = (*L)->next;
        (*L)->next = p ;            //插到表头
    }
}

int del_min(LinkList *L , int e)
{
    LinkList min;
    LinkList p  ;
    p = (*L)->next , min = p;
    if(p==NULL)
        return ERROR;
    while(p != NULL)
    {
        if(p->data<min->data)
        {
            min = p ;
            p = p->next ;
        }
        else
        {
            p = p->next ;
        }
    }
    e = min->data;

    if((min->data)/2==0)
        free(min->next);
    else
    {
        min->data = min->next->data;
        min->next->data = e ;
    }


    return e ;

}


int  main ()
{

    printf("\n");
    LinkList L;
    int i , n , m = 1 ;
    n=10;
    CreateListHead(&L , n);

    for(i = 0 ; i<= 10 ; i++)
    {
        L= L->next;
        printf("%d",L->data);
        if(5/m==0)
            printf("\n");
        m++;

    }

    printf("\n\n");

    int e= 0 ,j;
    m=1;
    j=del_min(&L , e);

    printf("输出最小值:%d\n\n\n",j);
    for(i = 0 ; i<= 10 ; i++)
    {
        L= L->next;
        printf("%-1d",L->data);

        if(5/m==0)
            printf("\n");
        m++;

    }
    printf("\n\n");
    return 0 ;
}

求帮忙解决方法

修改如下,那个函数找到最小值,供参考:

#include<stdio.h>
#include<malloc.h>
#include<time.h>
#include<stdlib.h>
#include <crtdbg.h>

#define ERROR 0
typedef int ELemType;
typedef struct Node
{
    ELemType data;
    struct Node* next;
}Node;
typedef struct Node* LinkList;

void CreateListHead(LinkList* L, int n)
{
    LinkList p;
    int i;
    //srand(time(0));  //初始化随机种子
    (*L) = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;        //建立带头结点的链表
    for (i = 0; i < n; i++)
    {
        p = (LinkList)malloc(sizeof(Node));
        p->data = rand() % 100 + 1;//随机生成100以内数
        p->next = (*L)->next;
        (*L)->next = p;            //插到表头
    }
}
int del_min(LinkList* L, int e)
{
    LinkList min;
    LinkList p;
    p = (*L)->next, min = p;
    if (p == NULL)
        return ERROR;
    while (p != NULL)
    {
        if (p->data < min->data)
        //{
            min = p;
            //p = p->next;
        //}
        //else
        //{
        p = p->next;
        //}
    }
    e = min->data;
    //if ((min->data) / 2 == 0)
    //    free(min->next);
    //else
    //{
    //    min->data = min->next->data;
    //    min->next->data = e;
    //}
    return e;
}

int  main()
{
    printf("\n");
    LinkList L, p;
    int i, n, m = 1;
    n = 10;
    srand((unsigned int)time(NULL));  //初始化随机种子
    CreateListHead(&L, n);
    p = L;
    for (i = 0; i < 10; i++)     //for (i = 0; i <= 10; i++)
    {
        p = p->next;
        printf("%2d ", p->data);
        if ((i + 1) % 5 == 0)     //if (5 / m == 0)
            printf("\n");
                                  //m++;
    }
    printf("\n\n");
    int e = 0, j;
                                 //m = 1;
    j = del_min(&L, e);
    printf("输出最小值:%d\n\n\n", j);
    p = L;
    for (i = 0; i < 10; i++)  //for (i = 0; i <= 10; i++)
    {
        p = p->next;
        printf("%-2d ", p->data);
        if ((i + 1) % 5 == 0)     //if (5 / m == 0)
            printf("\n");
                                  //m++;
    }
    printf("\n\n");
    return 0;
}

for(i = 0 ; i<= 10 ; i++),这里不能i<=10,只能i<10
另外main中第一遍打印节点数据循环不能改变L的值,否则后面del_min的L已经不是头结点啦
if(5/m==0)改为if(m%5==0)
j=del_min(&L , e);---你这个e到底是输入参数函数返回参数啊,如果是输入,那么e你也没有赋值啊,如果是返回,那么应该定义为引用或指针类型
、、、
if((min->data)/2==0)
free(min->next);
else
{
min->data = min->next->data;
min->next->data = e ;
}
这段代码也是风险重重,随意的free节点,一是next一定存在?而是free以后链表不调整关联性?else部分,直接min->next->data,你怎么确定next不是NULL啊