#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'函数似乎有错误。 我必须使排序插入功能“添加”来解决问题。
答案 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;
}