LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1309|回复: 2

关于单链表中C的小问题

[复制链接]
发表于 2009-6-12 00:19:24 | 显示全部楼层 |阅读模式
昨天和今天抽空练习写一个单链表的程序,但发现了还有几个C语言的问题,没弄明白,
就发到版上来,请各位帮忙给我看一下:
1.在main()里的do-while里,我发现第一个scanf()有问题,输入的值在(2)还是正常的,但到了(4),
就变成了 空!第2个scanf()在(4)是正常的!

2. 我写的add()是用来将输入的值作为一个节点,链接到一个全局的链表glbLinkList,若我多输入几个,
就会发现每次最后一个输入的节点值,并没有链接到glbLinkList里来,见我的输入节点信息。

。。。。
Do you wanna continue(y/n)?  y
name is: as

***(2--as)
name is: b4

***(2--b4)
scope is 64
        You Input val: name1=[], name2=[b4] scope=64

[Debug-add()]*** we will add b4--64 from struct ll***   《===这里其实已经接收到了b4 和64,但下面的表里只接收到bc和63,不知道是什么原因?
[Debug-add()] append to linklist:[ba]--[61]
[Debug-add()] append to linklist:[bb]--[62]
[Debug-show()] Finish all input, now will display


                Link List:
        ID   Name          Scope
        1    ba               61
        2    bb               62
        3    bc               63

Do you wanna continue(y/n)?  n
        will exit
[Debug-show()] Finish all input, now will display


                Link List:
        ID   Name          Scope
        1    ba               61
        2    bb               62
        3    bc               63
[root@localhost temp]#


我觉得这个问题应该是add()有问题,但不知道是哪儿。


下面是我的程序,在FC8上用gcc编译的。
==========================================================================================

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct LinkList
{
     char name[10];
     unsigned char scope;
     struct LinkList  *next;

}mylinklist;

//gloable var
static mylinklist *glbLinkList;

int  show(void)
{
mylinklist *cur;
if(glbLinkList==NULL)
    return 0;
int cnt=1;
printf("[Debug-show()] Finish all input, now will display\n\n");
printf("\n\t\tLink List:\n");
printf("\tID   Name          Scope\n");
        for(cur=glbLinkList;
            cur->next != NULL;
            cur = cur->next
           )
        {
             printf("\t%-5d%-14s%5d\n", cnt, cur->name, cur->scope);  //null
             cnt++;
        }
}


int  add(char *name, unsigned char scope)
{

    mylinklist *ll;
    ll = (struct LinkList *)malloc(sizeof(mylinklist));
    if(ll == NULL)
    {
        printf("[Debug--add()] cannot alloc mem for ll\n");
        return 0;
    }
    strcpy(ll->name, name);
    ll->scope=scope;
    ll->next=NULL;

printf("[Debug-add()]*** we will add %s--%d from struct ll***\n", ll->name, ll->scope);
//check glbLinkList content
    if(glbLinkList == NULL)
    {
        //init
        printf("[Debug-add()]init\n");
        glbLinkList = ll;

    }else //insert(append)
    {

        mylinklist *cur;
        for(cur=glbLinkList;
            cur->next != NULL;
            cur = cur->next
           )
        {
            printf("[Debug-add()] append to linklist:[%s]--[%d]\n", cur->name, cur->scope);
        }

         cur->next=ll;

         ll->next = NULL;
         cur=ll;
    }

    show(); //for test

    return 0;
}

int main(void)
{
printf("\n\tSingle LinkList test: \t");
printf("(Input name and stcope to Single linklist) \n");

int flag=0;
int len=0;
char ch[2]={0};
char sname[10];
sname[0]='\0';
unsigned char nscope;
mylinklist sll;
memset(&sll, 0, sizeof(mylinklist));
char Testname[11];

do
{
    Testname[0]='\0';
    sname[0]='\0';
    nscope=0;

//    printf("scope is ");   //1.若把scope放在起始开头这里,name就不会丢失了,很奇怪!!!
//    scanf("%d", &nscope);


    printf("name is: ");
    scanf("%s", sname);
    printf("\n");
    //printf(" ([%s])\n", sname);  //2.这个地方可以正常
    len=strlen(sname);
    if(len > 0)
   {
        sname[len]='\0';
        printf("***(%d--%s) \n", len, sname);
    }

/*
//3.这里已经被移到后面去了。
    printf("scope is ");
    scanf("%d", &nscope);
*/
    printf("name is: ");
    scanf("%s", Testname);
    printf("\n");

    len=strlen(Testname);
    if(len > 0)
    {
        Testname[len]='\0';
        printf("***(%d--%s) \n", len, Testname);
    }

    printf("scope is ");  //移到这儿
    scanf("%d", &nscope);

//4.这里sname总是为空,但Testname却总是对的
printf("\tYou Input val: name1=[%s], name2=[%s] scope=%d \n\n",sname,Testname,nscope);
//   printf("Input val: name=[%s] scope=[%d] \n", sname, nscope);

    if(len == 0 )
    {
        printf("Inputed sname is null, will exit\n");
        return 0;
    }
    if(nscope <= 0)
    {
        printf("Inputed scope is zero, will exit\n");
        return 0;
    }


    add(Testname, nscope);

    printf("\nDo you wanna continue(y/n)?  ");
    scanf("%s", ch); //ch=getch();
    if( ch[0] != 'y')
    {
        printf("\twill exit \n");
    }
}while(ch[0]=='y' || ch[0]=='Y');

   show();

return 0;

}
发表于 2009-6-12 11:15:03 | 显示全部楼层
问题应该出在:你声明的时候unsigned char nscope;而你输入的时候scanf("%d", &nscope),将char换成int就没有问题了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-6-13 08:40:01 | 显示全部楼层
多谢你的提醒。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表