因此,我开始研究C语言中的数据结构,并希望编写一个单链表。
这只是其中的一小部分:
struct nodes {
int val;
struct nodes *next;
};
void insert(struct nodes *list, int val) {
struct nodes *tmp = (struct nodes*) malloc(sizeof(struct nodes));
tmp->val = val;
tmp->next = list;
list = tmp;
}
int main() {
struct nodes *test;
insert(test, 5);
insert(test, 10);
printf("test %d\n", test->next->val);
}
在这里我得到完全错误的输出。当我尝试编写不需要传递结构指针的函数时,它的工作原理与预期的一样。
输出:
test 90053
PS我仍然从C开始,所以不要太刻苦:D
您可以这样进行:
struct nodes {
int val;
struct nodes* next;
};
nodes* insert(struct nodes* list, int val) {
struct nodes* tmp = (struct nodes*)malloc(sizeof(struct nodes));
tmp->val = val;
tmp->next = list;
return tmp;
}
当尝试使用类似第一个函数的结构时,您写的---我相信---是list()而不是insert()。
在每个可以更改列表起始地址的函数中,您都必须返回该地址,否则它将丢失。而且由于您仅在开始处插入,所以丢失了所有内容,因为开始地址始终会更改。.通常不要使用void
。至少是浪费,通常是一个错误。返回一些信息,例如完成状态。查看list()
返回的实现...size
int list(struct nodes* list)
{
struct nodes* p = list;
int N = 0;
while (p != NULL)
{
printf("#%d %d\n", N, p->val);
p = p->next; N += 1;
};
printf("\n");
return N;
}
int main() {
struct nodes* test = NULL;
int n = 0;
for(n = 800; n>0; n-= 100) test = insert(test, n);
n = list(test);
printf("At the end list() returned %d\n", n);
}
这样,您从一开始就可以获得更多信息。
#0 100
#1 200
#2 300
#3 400
#4 500
#5 600
#6 700
#7 800
At the end list() returned 8
#include <stdio.h>
#include <stdlib.h>
struct no
{
void* item;
struct no* next;
struct no* prev;
}; // no
typedef struct no Node;
typedef struct
{
char* name;
unsigned size;
unsigned limit;
Node* start;
Node* end;
} List;
struct nodes {
int val;
struct nodes* next;
};
struct nodes* insert(struct nodes*, int);
int list(struct nodes* L);
int main() {
struct nodes* test = NULL;
int n = 0;
for(n = 800; n>0; n-= 100) test = insert(test, n);
n = list(test);
printf("At the end list() returned %d\n", n);
}
struct nodes* insert(struct nodes* list, int val) {
struct nodes* tmp = (struct nodes*)malloc(sizeof(struct nodes));
tmp->val = val;
tmp->next = list;
return tmp;
}
int list(struct nodes* list)
{
struct nodes* p = list;
int N = 0;
while (p != NULL)
{
printf("#%d %d\n", N, p->val);
p = p->next; N += 1;
};
printf("\n");
return N;
}
如评论中所指出的,请注意,列表不是node
。节点集合的列表,并且节点具有数据有效负载。如果有效负载为a,(void*)
那么您将拥有一个真正的抽象数据结构,因为它可以加载任何内容,从单个char
到一个100-fields structure
。
考虑一下您编写它的方式以及您的程序中有5个列表的情况:一团糟,它将变得非常快。并与下面的代码进行比较
struct no
{
void* item;
struct no* next;
struct no* prev;
}; // no
typedef struct no Node;
typedef struct
{
char* name;
unsigned size;
unsigned limit;
Node* start;
Node* end;
} List;
请注意,当您向其中添加更多信息时,List
事情会变得更加容易:您总是有一个大小,一个限制,开始和结束的指针等等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句