|
昨天和今天抽空练习写一个单链表的程序,但发现了还有几个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;
} |
|