单链表生成,有点小问题,请来看一下

时间:2023-01-29 20:39:23
#include <stdio.h>
#include <malloc.h>

#define NULL 0

typedef struct node{
char data;
struct node* next;
}NODE;

NODE* create(int n)
{
NODE *head,*p,*q;

if(n == 0)
{
return NULL;
}
else
{
head = (NODE*)malloc(sizeof(NODE));
p = head;
for(int i = 0; i < n; i++)
{
printf("请输入第%d个链表结点的内容:",i+1);
scanf("%c\n",&(p->data));
if(i==(n-1))
{
p->next = NULL;
break;
}
else
{
q = (NODE*)malloc(sizeof(NODE));
p->next = q;
p = q;
}
}
return head;
}
}

main()
{
int n;
NODE *head,*p;
head = (NODE*)malloc(sizeof(NODE));
printf("\n请输入链表的长度:");
scanf("%d",&n);
head = create(n);

if(head == NULL)
printf("空链表!\n");
else
{
p = head;
printf("\n生成的链表为:");
p = (NODE*)malloc(sizeof(NODE));
p = head;
for(int i = 0; i < n; i++)
{
printf("%c",p->data);
if(i!=(n-1) && i>0)
{
p = p->next;
printf("->");
}
}
}
return 0;
}

我的问题是:为什么第一次输入的结点的内容不保存在head->data中
运行起来后总是少显示一个结点
比如n=5,就只出来4个
看了好半天也没弄明白哪出问题了,请帮忙看看

5 个解决方案

#1


printf("请输入第%d个链表结点的内容:",i+1);
/*在这后面加上下面一条语句,因为输入流里面还有数据,所以再次读的时候要清空*/
fflush(stdin);

#2


加上之后为什么总要输入两次回车才能结束啊

#3


还有这个if(i!=(n-1) && i>0)
改为if(i!=(n-1) && i>=0)

#4


嗯,已经修改完毕
把正确的贴上:
#include <stdio.h>
#include <malloc.h>

#define NULL 0

typedef struct node{
char data;
struct node* next;
}NODE;

NODE* create(int n)
{
NODE *head,*p,*q;

if(n == 0)
{
return NULL;
}
else
{
p = (NODE*)malloc(sizeof(NODE));
head = p;
for(int i = 0; i < n; i++)
{
printf("&Ccedil;&euml;&Ecirc;&auml;&Egrave;&euml;&micro;&Uacute;%d&cedil;&ouml;&Aacute;&acute;±í&Ocirc;&ordf;&Euml;&Oslash;&micro;&Auml;&Auml;&Uacute;&Egrave;&Yacute;:",i+1);
fflush(stdin);
scanf("%c",&(p->data));
printf("&Auml;ú&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&micro;&Uacute;%d&cedil;&ouml;&Aacute;&acute;±í&Ocirc;&ordf;&Euml;&Oslash;&micro;&Auml;&Auml;&Uacute;&Egrave;&Yacute;&Ecirc;&Ccedil;:%c\n",i+1,p->data);
if(i==(n-1))
{
p->next = NULL;
break;
}
else
{
q = (NODE*)malloc(sizeof(NODE));
p->next = q;
p = q;
}
}
return head;
}
}

main()
{
//&Aacute;&acute;±í&micro;&Auml;&sup3;¤&para;&Egrave;&pound;&not;&Oacute;&Eacute;&Oacute;&Atilde;&raquo;§&Ecirc;&auml;&Egrave;&euml;
int n;
//&para;¨&Ograve;&aring;&Egrave;&yacute;&cedil;&ouml;&Aacute;&acute;±í&frac12;á&micro;&atilde;&Ouml;&cedil;&Otilde;&euml;
NODE *head,*p;
head = (NODE*)malloc(sizeof(NODE));
printf("&Ccedil;&euml;&Ecirc;&auml;&Egrave;&euml;&Aacute;&acute;±í&micro;&Auml;&sup3;¤&para;&Egrave;:");
scanf("%d",&n);
printf("\n");
head = create(n);

if(head == NULL)
printf("&iquest;&Otilde;&Aacute;&acute;±í!\n");
else
{
p = head;
printf("\n&Eacute;ú&sup3;&Eacute;&micro;&Auml;&Aacute;&acute;±í&Icirc;&ordf;:");
p = (NODE*)malloc(sizeof(NODE));
p = head;
for(int i = 0; i < n-1; i++)
{
printf("%c->",p->data);
p = p->next;
}
printf("%c",p->data);
}
return 0;
}

#5


你好,你的代码有不少不妥的地方,可以把以下我改过的代码试试,然后加以比较:

#include <stdio.h>
#include <malloc.h>

#define NULL 0

typedef struct node{
char data;
struct node* next;
}NODE;

NODE* create(int n)
{
NODE *head,*p,*q;

if(n == 0)
{
return NULL;
}
else
{
        head = (NODE*)malloc(sizeof(NODE));
  p = head;
        for(int i = 0; i < n; i++)
{
printf("请输入第%d个链表结点的内容:",i+1);
scanf("\n%c",&(p->data));         /***此处更改*****/
if(i==(n-1))
{
p->next = NULL;
break;
}
else
{
q = (NODE*)malloc(sizeof(NODE));
p->next = q;
p = q;
}
}
return head;
}
}

main()
{
int n;
NODE *head,*p;
// head = (NODE*)malloc(sizeof(NODE));          /***此处更改****/
printf("\n请输入链表的长度:");
scanf("%d",&n);  
head = create(n);

if(head == NULL)
printf("空链表!\n");
else
{
// p = head;   /***此处更改*****/         
                  printf("\n生成的链表为:");
// p = (NODE*)malloc(sizeof(NODE));/***此处更改*****/
p = head;
for(int i = 0; i < n; i++)
{
printf("%c",p->data);
if(i < n-1)                 /***此处更改*****/
{
p = p->next;
printf("->");
}
}
}
return 0;
}
另外,象这样在CREAT()里面申请了空间过后又不释放,是会消耗内存的,(!!!)只不过这个程序小,影响不大!

#1


printf("请输入第%d个链表结点的内容:",i+1);
/*在这后面加上下面一条语句,因为输入流里面还有数据,所以再次读的时候要清空*/
fflush(stdin);

#2


加上之后为什么总要输入两次回车才能结束啊

#3


还有这个if(i!=(n-1) && i>0)
改为if(i!=(n-1) && i>=0)

#4


嗯,已经修改完毕
把正确的贴上:
#include <stdio.h>
#include <malloc.h>

#define NULL 0

typedef struct node{
char data;
struct node* next;
}NODE;

NODE* create(int n)
{
NODE *head,*p,*q;

if(n == 0)
{
return NULL;
}
else
{
p = (NODE*)malloc(sizeof(NODE));
head = p;
for(int i = 0; i < n; i++)
{
printf("&Ccedil;&euml;&Ecirc;&auml;&Egrave;&euml;&micro;&Uacute;%d&cedil;&ouml;&Aacute;&acute;±í&Ocirc;&ordf;&Euml;&Oslash;&micro;&Auml;&Auml;&Uacute;&Egrave;&Yacute;:",i+1);
fflush(stdin);
scanf("%c",&(p->data));
printf("&Auml;ú&Ecirc;&auml;&Egrave;&euml;&micro;&Auml;&micro;&Uacute;%d&cedil;&ouml;&Aacute;&acute;±í&Ocirc;&ordf;&Euml;&Oslash;&micro;&Auml;&Auml;&Uacute;&Egrave;&Yacute;&Ecirc;&Ccedil;:%c\n",i+1,p->data);
if(i==(n-1))
{
p->next = NULL;
break;
}
else
{
q = (NODE*)malloc(sizeof(NODE));
p->next = q;
p = q;
}
}
return head;
}
}

main()
{
//&Aacute;&acute;±í&micro;&Auml;&sup3;¤&para;&Egrave;&pound;&not;&Oacute;&Eacute;&Oacute;&Atilde;&raquo;§&Ecirc;&auml;&Egrave;&euml;
int n;
//&para;¨&Ograve;&aring;&Egrave;&yacute;&cedil;&ouml;&Aacute;&acute;±í&frac12;á&micro;&atilde;&Ouml;&cedil;&Otilde;&euml;
NODE *head,*p;
head = (NODE*)malloc(sizeof(NODE));
printf("&Ccedil;&euml;&Ecirc;&auml;&Egrave;&euml;&Aacute;&acute;±í&micro;&Auml;&sup3;¤&para;&Egrave;:");
scanf("%d",&n);
printf("\n");
head = create(n);

if(head == NULL)
printf("&iquest;&Otilde;&Aacute;&acute;±í!\n");
else
{
p = head;
printf("\n&Eacute;ú&sup3;&Eacute;&micro;&Auml;&Aacute;&acute;±í&Icirc;&ordf;:");
p = (NODE*)malloc(sizeof(NODE));
p = head;
for(int i = 0; i < n-1; i++)
{
printf("%c->",p->data);
p = p->next;
}
printf("%c",p->data);
}
return 0;
}

#5


你好,你的代码有不少不妥的地方,可以把以下我改过的代码试试,然后加以比较:

#include <stdio.h>
#include <malloc.h>

#define NULL 0

typedef struct node{
char data;
struct node* next;
}NODE;

NODE* create(int n)
{
NODE *head,*p,*q;

if(n == 0)
{
return NULL;
}
else
{
        head = (NODE*)malloc(sizeof(NODE));
  p = head;
        for(int i = 0; i < n; i++)
{
printf("请输入第%d个链表结点的内容:",i+1);
scanf("\n%c",&(p->data));         /***此处更改*****/
if(i==(n-1))
{
p->next = NULL;
break;
}
else
{
q = (NODE*)malloc(sizeof(NODE));
p->next = q;
p = q;
}
}
return head;
}
}

main()
{
int n;
NODE *head,*p;
// head = (NODE*)malloc(sizeof(NODE));          /***此处更改****/
printf("\n请输入链表的长度:");
scanf("%d",&n);  
head = create(n);

if(head == NULL)
printf("空链表!\n");
else
{
// p = head;   /***此处更改*****/         
                  printf("\n生成的链表为:");
// p = (NODE*)malloc(sizeof(NODE));/***此处更改*****/
p = head;
for(int i = 0; i < n; i++)
{
printf("%c",p->data);
if(i < n-1)                 /***此处更改*****/
{
p = p->next;
printf("->");
}
}
}
return 0;
}
另外,象这样在CREAT()里面申请了空间过后又不释放,是会消耗内存的,(!!!)只不过这个程序小,影响不大!