69,382
社区成员
发帖
与我相关
我的任务
分享
typedef struct Node{
int num;
struct Node *next;
}
/*追加节点*/
int append(NODE *HEAD,int num) {
if (!HEAD || num < 0) {
return 0;
}
/*设置cur = HEAD*/
NODE *cur = HEAD;
/*cur一直遍历到最后*/
while (cur->next) {
cur = cur->next;
}
/*设置一个temp保存数据*/
NODE *temp = create_empty();
set_num(temp,num);
/*将cur的next指向temp*/
cur->next = temp;
return 1;
}
void file_append(NODE *node,int num) {
if (!node) {
return;
}
printf("\nbefore_node addr:0x%p\n",&node);
NODE *temp = create_empty();
temp->num = num;
node->next = temp;
/*这样应该保证每次node都是最后一个节点?*/
node = node->next;
printf("\n temp addr:0x%p\n node addr:0x%p\n", &temp,&node);
}
int file_input(NODE *HEAD,const char *filename) {
if (!HEAD) {
return 0;
}
NODE *tail = HEAD;
while (tail->next) {
tail = tail->next;
}
/*这样一来,tail最终指向了最后一个节点*/
FILE *fp = fopen(filename, "r");
if (!fp) {
return 0;
}
while (!feof(fp)) {
int temp;
fscanf(fp, "%d", &temp);
printf("\n===============%d=================\n",temp);
file_append(tail, temp);
printf("\nnode(tail) addr:0x%p\n", &tail);
printf("\n====================================\n");
}
fclose(fp);
return 1;
}
int main(int argc,char *argv[]) {
if (argc < 2) {
printf("请指明文件名\n");
getchar();
return 1;
}
NODE *head = create_empty();
clock_t start, end;
start = clock();
if(!file_input(head, argv[1])){
printf("文件不存在!\n");
getchar();
return 2;
}
end = clock();
printf("文件加载完毕!共耗时%d毫秒。\n",end - start);
print_chaintab(head);
getchar();
remove_all_nodes(head);
free(head);
return 0;
}
NODE *file_append(NODE **node,int num){
/*............*/
return (*node);
}
这样改么?请问这样改的意义是什么?
……………………
迭代么?[/quote]
不是这样,当然这样做也是可以,类似strcpy一样;可以通过返回值也可以通过传入传出参数实现返回。
这是两种方式来获取链表的头节点:一种是传二重指针进去,第二种就是传一重指针,但是返回值返回头节点地址;当然,还有第三种,就是两个都做,不过没必要。int main(int argc,char *argv[]) {
if (argc < 2) {
printf("请指明文件名\n");
getchar();
return 1;
}
printf("开始读取文件……");
getchar();
NODE *head = create_empty();
clock_t start, end;
start = clock();
if(!file_input(head, argv[1])){
printf("文件不存在!\n");
getchar();
return 2;
}
end = clock();
printf("文件加载完毕!共耗时%d毫秒。\n",end - start);
/*print_chaintab(head);*/
getchar();
remove_all_nodes(head);
free(head);
printf("记录清除完毕……");
getchar();
return 0;
}
/*删除指定节点*/
int delete_node(NODE *node) {
if (!node) {
return 0;
}
memset(node, 0, sizeof(node));
free(node);
return 1;
}
/*清空链表所有节点*/
int remove_all_nodes(NODE *HEAD) {
if (!HEAD) {
return 0;
}
NODE *cur = HEAD;
NODE *temp = NULL;
while (cur) {
temp = cur->next;
cur->next = cur->next->next;
delete_node(temp);
cur = cur->next;
}
return 1;
}
NODE *file_append(NODE **node,int num){
/*............*/
return (*node);
}
这样改么?请问这样改的意义是什么?
……………………
迭代么?void file_append(NODE **node,int num) {
if (!*node) {
return;
}
printf("\nbefore_node addr:0x%p\n",*node);
NODE *temp = create_empty();
temp->num = num;
(*node)->next = temp;
/*这样应该保证每次node都是最后一个节点?*/
(*node) = temp;
printf("\n temp addr:0x%p\n node addr:0x%p\n", *node);
}
//...
file_append(&tail, temp);