使用双指针将字符串转换为链表
String to linked list using double pointer
我有以下代码
我将存储的字符串转换为链表。
示例:ABC
A->B->C->NULL
问题:
打印列表时,它没有给出所需的 output.Following 是代码和示例 input/outputs。
代码
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
char ch;
struct node *next;
}node;
void create(node **head,char ch)
{
node *new;
new=malloc(sizeof(node));
new->next=NULL;
new->ch=ch;
if(*head==NULL)
{
*head=new;
printf("%c",(*head)->ch);
return ;
}
while((*head)->next)
{
(*head)=(*head)->next;
}
(*head)->next=new;
}
void printList(node *head)
{
printf("\nThe list has - ");
while(head)
{
printf("%c",head->ch);
head=head->next;
}
printf("\n\n");
}
int main()
{
node *head=NULL;
int i=0;
char *str=NULL;
str=malloc(sizeof(char)*15);
printf("\nEnter the string - ");
scanf("%s",str);
while(str[i]!='[=10=]')
{
create(&head,str[i]);
i++;
}
printList(head);
return 0;
}
样本Input/Outputs
输入 1
Enter the string - abc
a
The list has - bc
输入 2
Enter the string - abcde
a
The list has - de
输入 3
Enter the string - ab
a
The list has - ab
注:
如果我将创建函数更改为此,一切正常!
我想知道这里有什么区别?
跟双指针有关系吗??
void create(node **head,char ch)
{
node *new,*ptr;
new=malloc(sizeof(node));
new->next=NULL;
new->ch=ch;
ptr=*head;
if(ptr==NULL)
{
ptr=new;
return;
}
while(ptr->next)
{
ptr=ptr->next;
}
ptr->next=new;
}
谢谢!
第一个代码片段中的插入函数存在问题,您将 *head
移动到该位置,因此当您将最后一个节点插入列表时,头部指向最后一个节点之前的节点
a->b->c->d
|
|
Head is at c now
所以你不应该移动 head 而只是使用临时变量来获取 head 的值并移动 temp。
a->b->c->d
| |
| |
Head temp
Has it something to do with the double pointer??
不,只是在第二个片段中,您使用 ptr
作为临时指针并且没有移动头部,您的代码如上所示工作。
Gopi 已经指出了您的代码存在的问题。如果您区分将第一个节点插入到空列表(在这种情况下您必须更新 head
)和附加到现有列表的两种情况,则可以使用该建议来插入新节点。 (您已经掌握了这两种情况。)
但是pointer-to-pointer策略增加了一层间接,你可以在这里使用它来做,没有这个区别:head
持有指向头节点指针的指针。如果使用 head
遍历列表,head
应始终指向指向当前节点的指针。当当前节点为NULL
时,分配新节点,即覆盖指针:
void create(node **head, char ch)
{
/* create new node */
node *nd = malloc(sizeof(*nd));
nd->next=NULL;
nd->ch=ch;
/* advance to end of list */
while (*head) {
head = &(*head)->next;
}
/* assign */
*head = nd;
}
顺便说一句,你的第二个函数不能很好地工作,因为你从不更新头部。你会得到一个空列表和内存泄漏。
我有以下代码 我将存储的字符串转换为链表。 示例:ABC A->B->C->NULL
问题: 打印列表时,它没有给出所需的 output.Following 是代码和示例 input/outputs。
代码
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
char ch;
struct node *next;
}node;
void create(node **head,char ch)
{
node *new;
new=malloc(sizeof(node));
new->next=NULL;
new->ch=ch;
if(*head==NULL)
{
*head=new;
printf("%c",(*head)->ch);
return ;
}
while((*head)->next)
{
(*head)=(*head)->next;
}
(*head)->next=new;
}
void printList(node *head)
{
printf("\nThe list has - ");
while(head)
{
printf("%c",head->ch);
head=head->next;
}
printf("\n\n");
}
int main()
{
node *head=NULL;
int i=0;
char *str=NULL;
str=malloc(sizeof(char)*15);
printf("\nEnter the string - ");
scanf("%s",str);
while(str[i]!='[=10=]')
{
create(&head,str[i]);
i++;
}
printList(head);
return 0;
}
样本Input/Outputs
输入 1
Enter the string - abc
a
The list has - bc
输入 2
Enter the string - abcde
a
The list has - de
输入 3
Enter the string - ab
a
The list has - ab
注:
如果我将创建函数更改为此,一切正常! 我想知道这里有什么区别? 跟双指针有关系吗??
void create(node **head,char ch)
{
node *new,*ptr;
new=malloc(sizeof(node));
new->next=NULL;
new->ch=ch;
ptr=*head;
if(ptr==NULL)
{
ptr=new;
return;
}
while(ptr->next)
{
ptr=ptr->next;
}
ptr->next=new;
}
谢谢!
第一个代码片段中的插入函数存在问题,您将 *head
移动到该位置,因此当您将最后一个节点插入列表时,头部指向最后一个节点之前的节点
a->b->c->d
|
|
Head is at c now
所以你不应该移动 head 而只是使用临时变量来获取 head 的值并移动 temp。
a->b->c->d
| |
| |
Head temp
Has it something to do with the double pointer??
不,只是在第二个片段中,您使用 ptr
作为临时指针并且没有移动头部,您的代码如上所示工作。
Gopi 已经指出了您的代码存在的问题。如果您区分将第一个节点插入到空列表(在这种情况下您必须更新 head
)和附加到现有列表的两种情况,则可以使用该建议来插入新节点。 (您已经掌握了这两种情况。)
但是pointer-to-pointer策略增加了一层间接,你可以在这里使用它来做,没有这个区别:head
持有指向头节点指针的指针。如果使用 head
遍历列表,head
应始终指向指向当前节点的指针。当当前节点为NULL
时,分配新节点,即覆盖指针:
void create(node **head, char ch)
{
/* create new node */
node *nd = malloc(sizeof(*nd));
nd->next=NULL;
nd->ch=ch;
/* advance to end of list */
while (*head) {
head = &(*head)->next;
}
/* assign */
*head = nd;
}
顺便说一句,你的第二个函数不能很好地工作,因为你从不更新头部。你会得到一个空列表和内存泄漏。