链表代码不是非常优雅
问题描述:
这是代码的玩具版我真的想写:链表代码不是非常优雅
#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
,该功能是非常简化在这里。有了真正的功能,就没有办法事先知道返回值是什么。
现在,代码可以工作,但它会在列表末尾产生一个空节点,我将不得不摆脱它。可以重新编写这段代码来弥补这个缺陷吗?我试图避免循环头部的重复代码,即我不想在循环外部设置第一个具有代码的节点,然后在循环内部使用相同的代码设置以下节点。
答
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;
答
如何:
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;
}
答
我不知道你想要什么来实现这个功能,因为在这里你不会在任何输入扫描:
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<<<
考虑要求这对代码审查。 – Martin