输出数字出错,自动结束
代码如下:
#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啊