问题一:后插最后一个节点置空
void display(node* head)
{
node* temp = NULL;
temp = head;
while (temp)
{
printf("%5d", temp->info);
temp = temp->next;
}
}
node* find(node* head, int i)
{
int j = 1;
node* p = head;
if (i < 1)return NULL;
while (p && i != j)
{
p = p->next;
j++;
}
return p;
}
int main()
{
node* head = NULL;
node* p;
//前插
//head=create_list_h();
//后插
head = create_list_r();
p = find(head, 3);
display(head);
printf("1111111111");
//printf("\n%d\n",p->info);
return 0;
}
一个很奇怪的问题
1.只要display()函数运行了,剩下的程序不执行,不关find()函数,就算直接输出也不行,只要把display给注释了,程序可以正常运行
2.将printf放在display函数之前,都可以运行
3.前两种是在后插情况下的问题,但在前插方式创建的链表,以上问题都不存在
----正常情况 ----
总结问题:这与前插和后插有关系,但在链表创建时有区别,创建完成后还有区别吗?
原因:后插函数错了,正确写法
node* create_list_r()
{
node* head = NULL, * current_node, * remain_node=NULL;
datatype x = 0;
datatype flag = 1;
while (x != flag)
{
scanf_s("%d", &x);
current_node = (node*)malloc(sizeof(node));
current_node->info = x;
if (!head) head = current_node;
else
remain_node->next = current_node;
remain_node = current_node;
}
if(remain_node!=NULL) remain_node->next= NULL;
return head;
}
区别:之前if(remain_node!=null) remain_node->next=NULL;这一行原先写的是:
remain_node=NULL;
原先链表最后一个节点的位置已经被前一个节点的next记录,所以此时的re(原cur)已经无所谓了,随便指向什么都对链表没影响。所以,链表最后一个节点的next没有置空,使得display()的循环出问题,没办法停下来。
问题总结:还是对前插后插不熟悉,仍需复习
----前插后插总结----
问题二:删去链表中数值大于x而小于y的所有节点
问题三:作为flag的数字,不应该显示在链表中
node* create_list_h()
{
node* head = NULL, * current_node;
datatype x = 1;
datatype flag = 0;
scanf_s("%d", &x);
while (x != flag)
{
current_node = (node*)malloc(sizeof(node));
current_node->info = x;
current_node->next = head;
head = current_node;
scanf_s("%d", &x);
}
return head;
}
//后插链表
node* create_list_r()
{
node* head = NULL, * current_node, * remain_node=NULL;
datatype x =1;
datatype flag = 0;
scanf_s("%d", &x);
while (x != flag)
{
current_node = (node*)malloc(sizeof(node));
current_node->info = x;
if (!head) head = current_node;
else
remain_node->next = current_node;
remain_node = current_node;
scanf_s("%d", &x);
}
if(remain_node!=NULL) remain_node->next= NULL;
//使得后插链表diaplay()后无法再printf()其他的元凶
//remain_node = NULL;
return head;
}
改动:在while循环前先给x赋一个值,再在while循环中将赋值放到创建链表后