鱼C论坛

 找回密码
 立即注册
查看: 1004|回复: 2

[已解决]链表在数组指定位置插入元素,第一次输入没问题,第二次就开始报错。。

[复制链接]
发表于 2021-1-6 19:27:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[10];
        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[0] != '#');
        
        releaseMemory(&numberarray);
        return 0;

}
最佳答案
2021-1-6 20:11:02
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;
        }
}
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-6 20:06:28 | 显示全部楼层
        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                                                         ;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 20:11:02 | 显示全部楼层    本楼为最佳答案   
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;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表