自动排序插入功能

时间:2018-07-30 10:09:22

标签: c

#include <stdio.h>
#include <malloc.h>

typedef int element;
typedef struct ListNode {
    element data;
    struct ListNode *link;
} ListNode;

ListNode *temp;

int get_length(ListNode *nodetype) {
    int i;
    for (i = 0; nodetype != NULL; i++) {
        nodetype = nodetype->link;
    }
    return i;
}

void add(ListNode *listtype, element elementtype){
    listtype = (ListNode *)malloc(sizeof(ListNode));
    listtype->data= elementtype;
    listtype = listtype->link;
}


void display(ListNode *nodetype) {
    for (int i=0; nodetype != NULL; i++) {
        printf("%d ", nodetype->data);
        nodetype = nodetype->link;
    }
}

int main() {
    ListNode *list1=NULL;

    add(list1, 3);
    add(list1, 3);

    printf("%d\n", get_length(list1));
    display(list1);
}

当我有三个因素(ListNode ** phead,ListNode * p,ListNode * new_node)时,程序没有出错。但我只需要使用“列表”因子和“项目”因子来遵守原始要求。因为'get_length'函数和'display'函数可以很好地工作于先前的代码,所以我认为'add'函数似乎有错误。 我必须使排序插入功能“添加”来解决问题。

2 个答案:

答案 0 :(得分:0)

除了帖子下方评论中提到的内容外,还需要进行其他一些必要的修改:

OptionStatus Me.FKOptionCombo, Me.dtOptionDate 函数中,要创建新链接,请从以下位置更改原始链接:

add(.,.)

收件人:

void add(ListNode *listtype, element elementtype){
    listtype = (ListNode *)malloc(sizeof(ListNode));
    listtype->data= elementtype;
    listtype = listtype->link;
}

此外,在//create new link in function: newNode, modify its members, //then set original listtype == newNode void add(ListNode **listtype, element elementtype) { ListNode *newNode = calloc(1, sizeof (*newNode)); // add this new Node if(newNode)//test that calloc is successful { newNode->data = elementtype; newNode->link = *listtype;//these lines (*listtype) = newNode; //add new link to original } } 函数中,更改以下行:

get_length()

收件人:

nodetype->link = nodetype;

最后,在nodetype = nodetype->link; 中,更改:

main

收件人:

int main() {
    ListNode *list1=NULL;

    add(list1, 3);
    add(list1, 3);  

答案 1 :(得分:0)

注意:

我没测试过这段代码,很长一段时间都没有用C语言编写代码。

说明

首先,让我们修复您的添加功能。

它应该检查您的列表是否为空,如果存在则添加一个新节点。如果列表不为空,则应遍历列表,直到找到最后一个节点,创建一个新节点,并将其附加在其末尾。

void add(ListNode *listNode, element data){

    // The list is non-existent! Create it.
    if (listNode == null){
        // Create new node
        ListNode* newNode = (ListNode *)malloc(sizeof(ListNode));
        newNode->data = data;
        newNode->link = null;
        listNode = newNode;
        return;
    }

    // We always want to ensure that the pointer to the first element
    // of your list doesn't get override. 
    // Therefore, we create a new pointer which hold that address. 
    ListNode *currentNode = listNode;

    // Traverse the linked list until finding last element.
    while(currentNode->link != null){
        currentNode = currentNode->Link; 
    }

    // Create new node
    ListNode* newNode = (ListNode *)malloc(sizeof(ListNode));
    newNode->data = data;
    newNode->link = null;

    // Attach new node to linked list
    currentNode->link = newNode;
}

现在,我们已修复您的add方法,我们可以为您的insert方法创建逻辑,该逻辑类似于您的add方法,但具有顺序逻辑。

几乎,如果不存在,我们将创建列表。我们遍历列表,直到到达列表末尾或包含要搜索数据的元素为止。如果找到数据,则将那个节点设置为temp(这样就不会丢失它),将新节点的链接指向temp节点,将当前节点的链接指向新节点。如果我们到达列表的末尾但没有找到数据,则将新节点添加到列表的末尾。

void insert(ListNode *listNode, element data){

    // The list is non-existent! Create it.
    if (listNode == null){
        // Create new node
        ListNode* newNode = (ListNode *)malloc(sizeof(ListNode));
        newNode->data = data;
        newNode->link = null;
        listNode = newNode;
        return;
    }

    // We always want to ensure that the pointer to the first element
    // of your list doesn't get override. 
    // Therefore, we create a new pointer which hold that address. 
    ListNode *currentNode = listNode;

    // Traverse the linked list until finding last element.
    // Play here with >=, >, =<, <, or any other order combination.
    while(currentNode->link != null
          && currentNode->data < data){
        currentNode = currentNode->link; 
    }

    // Create new node
    ListNode* newNode = (ListNode *)malloc(sizeof(ListNode));
    newNode->data = data;
    newNode->link = null;

    // insert in the correct position
    if (currentNode->link != null){
        ListNode* tempNode = currentNode->link;
        currentNode->link = tempNode;
        currentNode->link = newNode;
        return;
    }

    // Attach new node to linked list
    currentNode->link = newNode;
}