首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言数据结构单链表,该怎么处理

2012-09-27 
C语言数据结构单链表#include stdio.h#include malloc.htypedef int datatypetypedef struct node{da

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

[解决办法]
这样就可以了

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);//打印链表


declare();
while(1)
{
int i ;
printf("请选择:\n");
scanf("%d",&i);
getchar();
switch(i)
{
case 1:p3=creatlist3();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();
getchar();
while(ch!='?')
{
s=(linklist *)malloc(sizeof(linklist));
s->data=ch;
r->next=s;
r=s;
ch=getchar();
getchar();
}
r->next=NULL;
printf("---------------带头结点的尾插法建立链表结束-------------\n");
return head;

}


void printLinklist(linklist * head)
{
linklist * p = head->next;
printf("链表为:\n");
int i =0;
while(p!=NULL)//为什么链表为abc,循环次数为6次
{

printf("%c\n",(char)p->data);
p=p->next;
i++;



}
printf("循环次数:%d",i);
}

热点排行