下面代码中,在建立链表函数中node->next = NULL; //这里为什么使用node->next = NULL;就会警告,node不是尾结点吗?我把尾结点的指针域置空为什么还会警告?我知道要用end->next =NULL;
//警告的内容是;使用未初始化的内存"node"
#pragma warning(disable : 4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN (sizeof(struct Student))
typedef struct Student
{
long num;
char name[20];
struct Student* next;
}student;
int main()
{
student* creat(int n);
void print(student * head);
student* del(student * a, student * b);
void fr(student * head);
int m, n;
student* ahead, *bhead;
printf("The number of students in Linked List A is:");
scanf("%d", &n);
printf("\n");
ahead = creat(n); //链表a
printf("The number of students in Linked List B is:");
scanf("%d", &m);
printf("\n");
bhead = creat(m); //链表b
del(ahead, bhead);
print(ahead);
return 0;
}
student* creat(int n)
{
int i;
student* head, * node, * end; //end是尾指针
head = (student*)malloc(LEN);
if (head == NULL)
{
printf("out of memory, the request failed!\n");
exit(-1);
}
memset(head, 0, LEN);
end = head;
printf("Please enter data for these students:\n");
for (i = 0; i < n; i++)
{
node = (student*)malloc(LEN);
if (node == NULL)
{
printf("out of memory, the rquest failed!\n");
exit(-1);
}
memset(node, 0, LEN);
end->next = node;
end = node;
scanf("%ld %s", &node->num, &node->name);
}
node->next = NULL; //这里为什么使用node->next = NULL;就会警告,node不是尾结点吗?我把尾结点的指针域置空有什么错?
//警告的内容是;使用未初始化的内存"node"
return head;
}
student* del(student* a, student* b) //删除a链表中与b链表相同的学号
{
student * pt;
student* p = a;
student* q = b;
for (p = a; p->next!= NULL;) //外循环执行到尾结点的前驱结点
{
for (q = b; q->next != NULL;q = q->next) //内循环执行到尾结点的前驱结点
{
if (p->next->num == q->next->num) //当前项p的后驱结点的数据 == 当前项q的后驱结点的数据
{
pt = p->next; //中间变量pt指向当前项p的后驱结点
p->next = pt->next; //当前项的指针域存放当前项p的后驱结点的后驱结点
free(pt); //释放当前项p的后驱结点的内存空间
pt = NULL;
break;
}
else if(q->next->next == NULL) //当q指向尾结点的前驱结点,就让p指向下一个结点
{
p = p->next;
}
} //内循环for语句里q = q ->next控制当前结点
//而for语句中(p->next->num == q->next->num)比较的是当前结点的下一个结点
//所以当内循环for语句里的q指向尾结点的前驱结点,下面的语句中就要进行尾结点的比较
//比较后,因为尾结点是链表的最后一个结点,并且尾结点已经比较过了,所以就要结束内循环,进行外循环
//每次都要判断内循环for语句中q是否指向尾结点的前驱结点,当q指向尾结点的前驱结点。就说明刚才尾结点已经比较过了,那么就执行外循环
}
return a;
}
void print(student* head)
{
printf("After processing, the data of these students are:\n");
for (head = head->next; head != NULL; head = head->next)
{
printf("%ld\t%s\n", head->num, head->name);
}
}
void fr(student* head)
{
student* p = head;
for (; p != NULL;)
{
p = p->next;
free(p);
p = NULL;
}
}
The number of students in Linked List A is:4
Please enter data for these students:
101 Wang
102 Li
105 Zhang
108 Wei
The number of students in Linked List B is:5
Please enter data for these students:
103 Zhang
104 Ma
105 Chen
107 Guo
108 Liu
After processing, the data of these students are:
101 Wang
102 Li
//警告的内容是;使用未初始化的内存"node"
因为如果for循环存在不满足条件的可能,那么由于node指针没有初始化,所以node->next是会出问题的。
正确写法是
定义node是初始化为NULL
最后应该是
if(node != NULL)
node->next = NULL;