2016-07-05 94 views
-1

这是代码的玩具版我真的想写:链表代码不是非常优雅

#include <stdio.h> 
#include <stdlib.h> 

typedef struct node_s { 
    char val; 
    struct node_s *next; 
} node; 

int n; 

char obtain_next_char(){ 
    if (n<100) { 
     return 'a'; 
    } else { 
     return 0; 
    } 
} 

int main() { 

    char c; 
    node *start, *curr; 

    n = 0; 
    start = malloc(sizeof(node)); 
    curr = start; 

    while ((c=obtain_next_char()) != 0) { 
     curr->val = c; 
     curr->next = malloc(sizeof(node)); 
     curr = curr->next; 
    } 
    curr->next = NULL; 

    printf("chain made, %d links\n", n); 

    curr = start; 

    while (curr != NULL) { 
     printf(">>>%c<<<\n",curr->val); 
     curr=curr->next; 
    } 

} 

首先,关于obtain_next_char,该功能是非常简化在这里。有了真正的功能,就没有办法事先知道返回值是什么。

现在,代码可以工作,但它会在列表末尾产生一个空节点,我将不得不摆脱它。可以重新编写这段代码来弥补这个缺陷吗?我试图避免循环头部的重复代码,即我不想在循环外部设置第一个具有代码的节点,然后在循环内部使用相同的代码设置以下节点。

+2

考虑要求这对代码审查。 – Martin

回答

1
node dummy, *start, *curr; 

curr = &dummy; 

while ((c=obtain_next_char()) != 0) { 
    curr->next = malloc(sizeof(node)); 
    curr = curr->next; 
    curr->val = c; 
} 
curr->next = NULL; 
start = dummy.next; 
1

如何:

start = NULL; 
while ((c=obtain_next_char()) != 0) { 
    if (!start) { 
     start = malloc(sizeof(node)); 
     curr = start; 
    } else { 
     curr->next = malloc(sizeof(node)); 
     curr = curr->next; 
    } 
    curr->val = c; 
    curr->next = NULL; 
} 
1

我不知道你想要什么来实现这个功能,因为在这里你不会在任何输入扫描:

char obtain_next_char(){ 
    if (n<100) { 
     return 'a'; 
    } else { 
     return 0; 
    } 
} 

也许你需要这个:

char obtain_next_char() 
{ 
    char c; 

    scanf(" %c",&c); //scanning input 

    if (n<100) //if number of links < 100 then, return character 
    { 
     return c; 
    } 
    else //else return '0' (ascii character) 
    { 
     return '0'; 
    } 
} 

,但它在列表的最后导致一个空节点

原因:

的问题是,被在年底创建了一个新的节点,而循环

while ((c=obtain_next_char()) != 0) 
{ 
    curr->val = c; 
    curr->next = malloc(sizeof(node)); //new node at end of each iteration 
    curr = curr->next; 
} 

所以,当你结束输入,最后一个空节点仍然


溶液:(不与代码的循环外第一节点)

为了避免这个问题,尝试在每个迭代

while ((c=obtain_next_char()) != '0') 
{ 
     if(n != 0) //to avoid again creating for head node 
     { 
      curr->next = malloc(sizeof(node)); 
      curr = curr->next; 
     } 
     curr->val = c; 
     n++; //increasing number of links 
} 
  • 这种方式,开始创建节点,您可以避免在每次迭代结束时创建额外的空节点。

我不想建立与代码的第一个节点的循环

while ((c=obtain_next_char()) != '0') 
{ 
     if(n != 0) //any other node 
     { 
      curr->next = malloc(sizeof(node)); 
      curr = curr->next; 
     } 
     else //for head node 
     { 
      start = malloc(sizeof(node)); 
      curr = start; 
     } 
     curr->val = c; 
     n++; //increasing number of links made 
} 

干脆把你的外码是:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct node_s { 
    char val; 
    struct node_s *next; 
} node; 

int n; 

char obtain_next_char() 
{ 
    char c; 

    scanf(" %c",&c); 

    if (n<100) 
    { 
     return c; 
    } 
    else 
    { 
     return '0'; 
    } 
} 

int main() { 

    char c; 
    node *start=NULL, *curr=NULL; 

    n = 0; 


    while ((c=obtain_next_char()) != '0') 
    { 
     if(n != 0) //any other node 
     { 
      curr->next = malloc(sizeof(node)); 
      curr = curr->next; 
     } 
     else //for head node 
     { 
      start = malloc(sizeof(node)); 
      curr = start; 
     } 

     curr->val = c; 
     n++; 
    } 

    curr->next = NULL; 

    printf("chain made, %d links\n", n); 

    curr = start; 

    while (curr != NULL) { 
     printf(">>>%c<<<\n",curr->val); 
     curr=curr->next; 
    } 

} 

输入

1 2 3 4 5 0 

输出

chain made, 5 links 
>>>1<<< 
>>>2<<< 
>>>3<<< 
>>>4<<< 
>>>5<<<