我想写一个单链表,然后用节点内部数据排序输出、
然后就出现了这个问题。
这个是我的代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct Teacher)
struct Teacher
{
char name[20];
int number;
struct Teacher* next;
};
int n;
struct Teacher* creat()
{
struct Teacher* p1 = NULL;
struct Teacher* p2 = NULL;
struct Teacher *head = NULL;
p1 = p2 = new struct Teacher;
scanf_s("%s%d", p1->name, sizeof(p1->name), &p1->number);
while (p1->number != 0)
{
n = n + 1;
if (n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = new struct Teacher;
scanf_s("%s%d", p1->name, sizeof(p1->name), &p1->number);
}
p2 = NULL;
return head;
}
void print_teacher(struct Teacher* head) //输出信息列表
{
struct Teacher* p;
p = head;
if (head != NULL)
{
while (p != NULL)
{
printf("%s %d\n", p->name, p->number);
p = p->next;
}
}
}
void sort_teacher1(struct Teacher* head) //教师工号排序(升序)
{
if (head == NULL)
return ;
else
{
struct Teacher* p1 = head;
struct Teacher* p2 = NULL;
while (p1->next != NULL)
{
p2 = p1->next;
if (p1->number >p2->number)
{
Teacher t;
t = *p1;
t.next = p2->next;
p2->next = p1->next;
*p1 = *p2;
*p2 = t;
}
p1 = p1->next;
}
}
}
int main()
{
struct Teacher* head;
head = creat();
sort_teacher1(head);
print_teacher(head);
return 0;
}
create函数有问题,最后一个节点的next指针没有指向NULL
n = n + 1;这里使用n的时候,n没有初始化
create函数修改如下:
#include <stdio.h>
struct Teacher
{
char name[20];
int number;
struct Teacher* next;
};
int n;
struct Teacher* creat()
{
struct Teacher* p1 = NULL;
struct Teacher* p2 = NULL;
struct Teacher *head = NULL;
p1 = p2 = new struct Teacher;
n = 0; //修改1:初始化n
scanf_s("%s%d", p1->name, sizeof(p1->name), &p1->number);
while (p1->number != 0)
{
n = n + 1;
if (n == 1)
{
head = p1;
p2 = head; //修改2:给p2赋值
}
else
p2->next = p1;
p2 = p1;
p1 = new struct Teacher;
scanf_s("%s%d", p1->name, sizeof(p1->name), &p1->number);
}
p2->next = NULL; //修改3,不是p2 = NULL
//最后的p1没用,需要释放空间
delete p1; p1=0;
return head;
}
struct Teacher* sort_teacher1(struct Teacher *head) //排序
{
if(NULL == head) //若链表为空则不用排序
{
return NULL;
}
if(NULL == head->next) //若链表中只有一个数,则不用比较
{
printf("min is head\n");
return head;
}
struct Teacher *min_pre = NULL;
struct Teacher *min = head;
struct Teacher *tmp = head;
struct Teacher *new_list = NULL;
struct Teacher *tail_sort = NULL;
while(head)
{
min = head;
tmp = head;
while(tmp->next)
{
if(min->number > tmp->next->number)
{
min = tmp->next;
min_pre = tmp;
}
tmp = tmp->next;
}
if(min == head)
{
head = head->next;
}
else
{
min_pre->next = min->next;
min->next = NULL;
}
if(NULL == new_list) //按照尾插将最小的数组成新的链表
{
tail_sort = min;
new_list = tail_sort;
}
else
{
tail_sort->next = min;
tail_sort = min;
}
}
return new_list;
}
void print_teacher(struct Teacher* head) //输出信息列表
{
struct Teacher* p;
p = head;
if (head != NULL)
{
while (p != NULL)
{
printf("%s %d\n", p->name, p->number);
p = p->next;
}
}
}
int main()
{
struct Teacher* head;
head = creat();
head = sort_teacher1(head);
print_teacher(head);
return 0;
}
12行int n应该改为 int n=0;
由于n没有初始化为0,导致n=n+1后,n值不是1,
因此
if (n == 1)
head = p1;
条件不成立,从而head没有赋值
同时由于78行定义head的时候没有初始化为NULL,导致sort函数中
if (head == NULL)
判断无效,从而后续对head的操作必然会崩溃