链表在数组指定位置插入元素,第一次输入没问题,第二次就开始报错。。
#include<winuser.inl>#include<stdio.h>
#include <cstdlib>
#include<string.h>
//将一个整数插进一个有序的数组
void getInput(struct Array* number);
void printfInfo(struct Array** head);
void releaseMemory(struct Array** head);
void tail_add(struct Array** head);
void find_position(struct Array** head, int insert_number);
struct Array
{
int value;
struct Array *next;
};
void getInput(struct Array* number)
{
printf("enter number:");
scanf_s("%d", &number->value);
}
void printfInfo(struct Array** head)
{
struct Array* number;
number = *head;
printf("the array is:\n");
while (number != NULL)
{
printf("%d",number->value);
number = number->next;
}
printf("\n");
}
void releaseMemory(struct Array** head)
{
struct Array* number, * temp;
number = *head;
while (number->next != NULL)
{
temp = number;
number = number->next;
free(temp);
}
}
void find_position(struct Array** head,int insert_number)
{
struct Array* previous,*current,*new_node;
//直接给previous赋值null,current赋值头节点,后面就不需要再用中间变量来存储之后,再进行交换地址了
//current此时就是一个空的结构体,头指针给他之后,他指向了链表的头节点
current = *head;
previous = NULL;
//找到合适于插入值的位置的前后节点的位置
while (current->next != NULL && current->value < insert_number)
{
previous = current;
current = current->next;
}
//生成一个新的节点
new_node = (struct Array*)(malloc(sizeof(struct Array)));
if (new_node == NULL)
{
printf("memory failed");
exit(1);
}
//将新的节点变成链表里面的一员,插入到前面找到的合适的位置那
if(current->next == NULL)//空链表,直接将头指针指向他
{
*head = new_node;
}
else
{
previous->next = new_node;
new_node->next = current;
new_node->value = insert_number;
}
}
void tail_add(struct Array** head)
{
struct Array* number, * temp;
number = (struct Array*)(malloc(sizeof(struct Array)));
if (number == NULL)
{
printf("memory failed");
exit(1);
}
getInput(number);
if (*head != NULL)
{
temp = *head;
//找尾节点
while (temp->next != NULL)
{
temp = temp->next;
};
//插入数据
temp->next = number;
number->next = NULL;
}
else
{
*head = number;
number->next = NULL;
}
}
int main()
{
struct Array* numberarray = NULL;////初始化一个指针,头指针,相当于定义了一个空的单链表
//struct Student* stu = NULL;
int num;
printf("total num of stu:");
scanf_s("%d", &num);
printf("\n");
printf("enter info:\n");
for (int i = 0; i < num; i++)
{
tail_add(&numberarray);
}
printf("finish entering!\n");
//printf("begining to print\n");
//printfInfo(&namelist);
int insert_number;
char sign;
do
{
printf("enter the number you want to insert:");
scanf_s("%d", &insert_number);
find_position(&numberarray, insert_number);
printfInfo(&numberarray);
printf("enter any letter continue,#表示结束\n");
scanf_s("%s", sign,10);
} while (sign != '#');
releaseMemory(&numberarray);
return 0;
} find_position() 有错误,下面是重写的
void find_position(struct Array ** head , int insert_number)
{
struct Array* p , * q , * r ;
r = (struct Array *) malloc(sizeof(struct Array)) ;
r -> value = insert_number ;
r -> next = NULL ;
for(p = q = * head ; p && p -> value < insert_number ; q = p , p = q -> next) ;
if(p == q) {
r -> next = * head ;
* head = r ;
} else {
q -> next = r ;
r -> next = p ;
}
} void find_position(struct Array** head,int insert_number)
{
struct Array* previous,*current,*new_node;
previous = * head;
current = (previous == NULL) ? NULL : previous->next;
new_node = (struct Array*)(malloc(sizeof(struct Array)));
if (new_node == NULL)
{
printf("memory failed");
exit(1);
}
else
{
new_node->value = insert_number;
new_node->next = NULL;
}
if(previous == NULL || insert_number <= previous->value)
{
*head = new_node;
(*head)->next = previous;
}
else
{
while (current != NULL && current->value < insert_number)
{
previous = current;
current = current->next;
}
previous->next = new_node;
new_node->next = current;
}
}
页:
[1]