从用户链表中扫描字符
Scan chars from user linked list of
我应该编写一个函数来扫描用户 的输入,直到输入 并将其输入链表。
我不能将它扫描成一个字符串,而是将它放入一个列表中。
我写了这段代码,但没有将字符输入链表,也没有从控制台退出,直到我按下 Exit。
typedef struct chNode
{
char data;
struct chNode *next;
}chNode;
chNode * createCharList(char data)
{
chNode *temp = (chNode*)malloc(sizeof(chNode));
temp->data = data;
temp->next = NULL;
return temp;
}
chNode * addCharToLast(chNode *head, char data)
{
chNode *p = head;
chNode *temp = createCharList(data);
if (head == NULL)
return temp;
while (p->next != NULL)
p = p->next;
p->next = temp;
return head;
}
chNode* insert_Charlist()
{
char ch;
chNode *Head = NULL;
printf("Enter chars For Linked-List Till 'Enter':\n");
scanf_s("%c", &ch);
while (ch != '\n')
{
Head = addCharToLast(Head, ch);
scanf_s("%c", &ch);
}
return Head;
}
void main()
{
chNode *Orignial_list = NULL;
Orignial_list = insert_Charlist(); // Function that imports a list
printf("You Entered This linked-list:\n");
printf_CharList(Orignial_list); //Printing the linked list
getch();
}
对于scanf的这次调用
scanf_s("%c", &ch);
您需要再指定一个参数
scanf_s( "%c", &ch, 1 );
您通过调用函数 addCharToLast
来实现函数 insert_Charlist
的方法效率低下,因为函数 addCharToLast
每次出现新字符时都会遍历整个列表添加到列表中。
我可以建议以下功能实现,如下面的演示程序所示。
#include <stdio.h>
#include <stdlib.h>
typedef struct chNode
{
char data;
struct chNode *next;
} chNode;
chNode * createNode(char data )
{
chNode *temp = (chNode*)malloc( sizeof( chNode ) );
if ( temp != NULL )
{
temp->data = data;
temp->next = NULL;
}
return temp;
}
size_t insert_Charlist( chNode **head )
{
while ( *head ) head = &( *head )->next;
size_t n = 0;
printf( "Enter chars For Linked-List Till 'Enter': " );
for ( int data; ( data = getchar() ) != EOF &&
data != '\n' &&
( *head = createNode( data ) ) != NULL; )
{
head = &( *head )->next;
++n;
}
return n;
}
void printf_CharList( const chNode *head )
{
for ( ; head != NULL; head = head->next )
{
printf( "%c -> ", head->data );
}
puts( "null" );
}
int main(void)
{
chNode *head = NULL;
insert_Charlist( &head );
printf_CharList( head );
return 0;
}
程序输出可能看起来像
Enter chars For Linked-List Till 'Enter': Hello
H -> e -> l -> l -> o -> null
注意根据C标准,不带参数的函数main应该声明为
int main( void )
我应该编写一个函数来扫描用户 的输入,直到输入 并将其输入链表。 我不能将它扫描成一个字符串,而是将它放入一个列表中。
我写了这段代码,但没有将字符输入链表,也没有从控制台退出,直到我按下 Exit。
typedef struct chNode
{
char data;
struct chNode *next;
}chNode;
chNode * createCharList(char data)
{
chNode *temp = (chNode*)malloc(sizeof(chNode));
temp->data = data;
temp->next = NULL;
return temp;
}
chNode * addCharToLast(chNode *head, char data)
{
chNode *p = head;
chNode *temp = createCharList(data);
if (head == NULL)
return temp;
while (p->next != NULL)
p = p->next;
p->next = temp;
return head;
}
chNode* insert_Charlist()
{
char ch;
chNode *Head = NULL;
printf("Enter chars For Linked-List Till 'Enter':\n");
scanf_s("%c", &ch);
while (ch != '\n')
{
Head = addCharToLast(Head, ch);
scanf_s("%c", &ch);
}
return Head;
}
void main()
{
chNode *Orignial_list = NULL;
Orignial_list = insert_Charlist(); // Function that imports a list
printf("You Entered This linked-list:\n");
printf_CharList(Orignial_list); //Printing the linked list
getch();
}
对于scanf的这次调用
scanf_s("%c", &ch);
您需要再指定一个参数
scanf_s( "%c", &ch, 1 );
您通过调用函数 addCharToLast
来实现函数 insert_Charlist
的方法效率低下,因为函数 addCharToLast
每次出现新字符时都会遍历整个列表添加到列表中。
我可以建议以下功能实现,如下面的演示程序所示。
#include <stdio.h>
#include <stdlib.h>
typedef struct chNode
{
char data;
struct chNode *next;
} chNode;
chNode * createNode(char data )
{
chNode *temp = (chNode*)malloc( sizeof( chNode ) );
if ( temp != NULL )
{
temp->data = data;
temp->next = NULL;
}
return temp;
}
size_t insert_Charlist( chNode **head )
{
while ( *head ) head = &( *head )->next;
size_t n = 0;
printf( "Enter chars For Linked-List Till 'Enter': " );
for ( int data; ( data = getchar() ) != EOF &&
data != '\n' &&
( *head = createNode( data ) ) != NULL; )
{
head = &( *head )->next;
++n;
}
return n;
}
void printf_CharList( const chNode *head )
{
for ( ; head != NULL; head = head->next )
{
printf( "%c -> ", head->data );
}
puts( "null" );
}
int main(void)
{
chNode *head = NULL;
insert_Charlist( &head );
printf_CharList( head );
return 0;
}
程序输出可能看起来像
Enter chars For Linked-List Till 'Enter': Hello
H -> e -> l -> l -> o -> null
注意根据C标准,不带参数的函数main应该声明为
int main( void )