C语言数据结构单链表,该怎么处理
C语言数据结构单链表
#include <stdio.h>
#include <malloc.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node*next;
}linklist;
void main()
{
linklist *p1,*p2,*p3;
void declare();
linklist *creatlist3();//带头结点的尾插法建立链表
void printLinklist(linklist * head);//打印链表
declare();
while(1)
{
int i ;
printf("请选择:\n");
scanf("%d",&i);
switch(i)
{
case 1:p1=creatlist1();break;
case 2:printLinklist(p3);break;
}
}
}
void declare()
{
printf("1->前插法建立链表\n");
printf("2->打印链表\n");
}
linklist *creatlist3()
{
printf("---------------带头结点的尾插法建立链表开始-------------\n");
linklist *s,*head,*r;
char ch;
head =(linklist *)malloc(sizeof(linklist));
r=head;
printf("请输入链表节点(‘?’结束输入)\n");
ch=getchar();
while(ch!='?')
{
s=(linklist *)malloc(sizeof(linklist));
s->data=ch;
r->next=s;
r=s;
ch=getchar();
}
r->next=NULL;
printf("---------------带头结点的尾插法建立链表结束-------------\n");
return head;
}
void printLinklist(linklist * head)
{
linklist * p = head->next;
printf("链表为:");
int i =0;
while(p!=NULL)//为什么链表为abc,循环次数为6次
{
printf("%c\n",(char)p->data);
p=p->next;
i++;
}
printf("循环次数:%d",i);
}
这是我的程序,为什么打印链表的循环次数不是所打印链表的个数,例如我的链表有a,b,c三个元素,打印是的循环次数为6
------解决方案--------------------
这样就可以了
#include <stdio.h>
#include <malloc.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node*next;
}linklist;
void main()
{
linklist *p1,*p2,*p3;
void declare();
linklist *creatlist3();//带头结点的尾插法建立链表
void printLinklist(linklist * head);//打印链表
declare();
while(1)
{
int i ;
printf("请选择:\n");
scanf("%d",&i);
switch(i)
{
case 1:p1=creatlist1();break;
case 2:printLinklist(p3);break;
}
}
}
void declare()
{
printf("1->前插法建立链表\n");
printf("2->打印链表\n");
}
linklist *creatlist3()
{
printf("---------------带头结点的尾插法建立链表开始-------------\n");
linklist *s,*head,*r;
char ch;
head =(linklist *)malloc(sizeof(linklist));
r=head;
printf("请输入链表节点(‘?’结束输入)\n");
ch=getchar();
while(ch!='?')
{
s=(linklist *)malloc(sizeof(linklist));
s->data=ch;
r->next=s;
r=s;
ch=getchar();
}
r->next=NULL;
printf("---------------带头结点的尾插法建立链表结束-------------\n");
return head;
}
void printLinklist(linklist * head)
{
linklist * p = head->next;
printf("链表为:");
int i =0;
while(p!=NULL)//为什么链表为abc,循环次数为6次
{
printf("%c\n",(char)p->data);
p=p->next;
i++;
}
printf("循环次数:%d",i);
}
这是我的程序,为什么打印链表的循环次数不是所打印链表的个数,例如我的链表有a,b,c三个元素,打印是的循环次数为6
------解决方案--------------------
这样就可以了
- C/C++ code
#include <stdio.h> #include <malloc.h> typedef int datatype; typedef struct node { datatype data; struct node* next; }linklist; void declare(); linklist *creatlist3();//带头结点的尾插法建立链表 void printLinklist(linklist * head);//打印链表 void main() { linklist *p1; declare(); while(1) { int i ; printf("请选择:\n"); scanf("%d",&i); switch(i) { case 1: p1=creatlist3(); break; case 2: printLinklist(p1); break; } } } void declare() { printf("1->前插法建立链表\n"); printf("2->打印链表\n"); } linklist *creatlist3() { printf("---------------带头结点的尾插法建立链表开始-------------\n"); linklist *s,*head,*r; char ch; head =(linklist *)malloc(sizeof(linklist)); r=head; printf("请输入链表节点(‘?’结束输入)\n"); ch=getchar(); while(ch!='?') { if(ch != '\n') { s=(linklist *)malloc(sizeof(linklist)); s->data=ch; r->next=s; r=s; } ch=getchar(); } r->next=NULL; printf("---------------带头结点的尾插法建立链表结束-------------\n"); return head; } void printLinklist(linklist * head) { linklist * p = head->next; printf("链表为:"); int i =0; while(p!=NULL)//为什么链表为abc,循环次数为6次 { printf("%c\n",(char)p->data); p=p->next; i++; } printf("循环次数:%d",i); }
------解决方案--------------------
二楼代码完全可以,不过楼主应该理解你程序出问题的原因:在你每次按键盘输入时,送进缓冲区的除了你输入的字符外,还有个回车字符,所以ch每次读完你输入的字符外,下载循环会将回车符输入,这样看似只有一次读取字符,其实读了两次,一次你输入的字符,一次回车符,楼主程序出错的原因就是没有把这个回车符去掉。这样改就可以了:
#include <stdio.h>
#include <malloc.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node * next;
}linklist;
void main()
{
linklist *p1,*p2,*p3;
void declare();
linklist *creatlist3();//带头结点的尾插法建立链表
void printLinklist(linklist * head);//打印链表