双向链表问题?
我创建了一个我认为是双向链表的东西。这个想法是反转在新行上输入的每个单词的输出,因此:
Hello\nAll\n.
.\nAll\nHello
这个想法是遍历我的列表直到找到 '\n'
,然后朝相反的方向走并打印出来,返回到我离开的地方,继续遍历直到另一条新行,然后再次前进并打印等。
但是,我当前的实现似乎无法开始工作,并且遇到了障碍,提示或技巧是赞赏!
typedef struct L {
char val;
struct L *next;
struct L *prev;
}List;
List *insertList(char val, List *t1 );
List *createList(void);
int main(void) {
List *z = createList();
List *pos = z;
while (pos != NULL) {
while ( z->val != '\n' ) {
if (z == NULL)
break;
z = z->next;
pos = z;
}
while (z != NULL) {
printf("%c", z->val);
z = z->prev;
}
}
return 0;
}
List *createList(void) {
List *h = NULL;
char c;
do {
c =(char)getchar();
h = insertList(c, h);
}while(c != '.');
return h;
}
List *insertList( char val, List *t1) {
List *t = calloc(1, sizeof( List ));
t->prev = NULL;
t->val = val;
t->next = t1;
if (t1 != NULL) {
t1->prev = t;
}
return t;
}
I've created, what I think to be a doubly linked list. The idea is to reverse output of words entered each on a new line, so:
Hello\nAll\n.
.\nAll\nHello
The idea is to traverse my list until '\n'
is found, then go in the opposite direction and print that off, go back to where I left, continue traversing until another new line, then go forward again and print etc.
However, my current implementation I can't seem to get to work and I've hit a brick wall, and hints or tips are appreciated!
typedef struct L {
char val;
struct L *next;
struct L *prev;
}List;
List *insertList(char val, List *t1 );
List *createList(void);
int main(void) {
List *z = createList();
List *pos = z;
while (pos != NULL) {
while ( z->val != '\n' ) {
if (z == NULL)
break;
z = z->next;
pos = z;
}
while (z != NULL) {
printf("%c", z->val);
z = z->prev;
}
}
return 0;
}
List *createList(void) {
List *h = NULL;
char c;
do {
c =(char)getchar();
h = insertList(c, h);
}while(c != '.');
return h;
}
List *insertList( char val, List *t1) {
List *t = calloc(1, sizeof( List ));
t->prev = NULL;
t->val = val;
t->next = t1;
if (t1 != NULL) {
t1->prev = t;
}
return t;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我认为你的结构需要改变,没有理由用双链表来解决你的问题。
你的结构应该包含
然后你的主循环应该是这样的:
I think your structure needs to be changed and there is no reason to have a double linked list to solve your problem.
your struct should contain
Then your main loop should be something like:
尝试这些 while 循环[编辑以注意 Chris 关于检查 LL 结束的评论]:
基本问题是当外部 while 循环缠绕时 z 没有重置;第二个问题是链表的末尾没有脱离第一个内部 while 循环;第三个问题是第二个内部 while 循环没有检查它正在打印的单词的结尾。
您还需要在最后释放链表,否则会出现内存泄漏。您还应该检查
calloc()
的返回值,以确保它没有返回 null。Try these while loops instead [EDITED to note Chris' comment about checking for end of LL]:
Basic issue was that z was not reset when the outer while loop wrapped around; second issue was that end of linked list didn't break out of first inner while loop; third issue was second inner while loop didn't check for end of the word it was printing.
You also need to free the linked list at the end or it'll be a memory leak. You should also check the return value of
calloc()
to be sure it didn't return null.好吧,我有时间了解为什么我的第一个答案不起作用 - 如果您通过调试器运行代码,则会出现一些明显的事情。这是一个完整的工作版本。它可能可以优化很多,但它遵循与原始代码相同的结构,因此希望您可以遵循它:
主要的变化是我输出换行符的方式。我意识到这不是您需要的每个单词后面的换行符,而是它之前的换行符(根本不合逻辑 - 我想知道这是否是问题最初的意图?)。但它现在输出的正是您所需要的。我还为您添加了一个函数来在最后释放链表内存。 :)
Ok, I've had time to see why my first answer wouldn't work - a few little obvious things if you run the code through a debugger. So here's a fully working version. It could probably be optimised quite a bit, but it follows the same structure as your original code so hopefully you can follow it:
The main change is how I output the linefeed. I realised it's NOT the linefeed after each word you need, but the one just BEFORE it (not logical at all - I wonder if that is what the question originally intended?). But it now outputs exactly what you require. And I've added a function to free the linked list memory at the end too for you. :)
}
}
// 删除函数
}
}
}
// Remove Function
}