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

这题如何做啊小弟我做的输不出字符串,咋回事

2012-03-18 
这题怎么做啊`````我做的输不出字符串,怎么回事?用链表实现一个学生名单记录表(学生信息至少包括学号、姓名

这题怎么做啊`````我做的输不出字符串,怎么回事?
用链表实现一个学生名单记录表(学生信息至少包括学号、姓名),并实现打印、查找、添加等操作,include   <stdio.h>
#include   <stdlib.h>
#include     <string.h>
#define     FLAG     0
/*定义表示单链表结点的结构体类型,并取一个新的类型名LNode*/
typedef   struct   node
{
char   Student[10];
int   StudentID;
struct   node   *   next;
}LNode;

/*初始化一个带头结点的单链表并返回其头指针(指向头结点的指针)*/
LNode   *   init_linklist()
{
LNode   *   p;
p   =   (LNode   *)malloc(sizeof(LNode));
p-> next   =   NULL;/*尾结点的指针域赋为空值NULL,表示单链表结束*/
return   p;
}

/*向单链表批量添加结点(从尾部添加)*/
void   batch_append(LNode   *   L)
{
        char     name[10];
int   ID;
LNode   *r,*p;
r   =   L;/*尾结点指针变量首先指向头结点*/
while(r-> next   !=   NULL)
{
r   =   r-> next;/*r指向尾结点*/
}
printf( "请输入姓名: ");
scanf( "%s ",name);
printf( "\n ");
printf( "请输入学号:   ");
scanf( "%d ",&ID);
while   (ID   !=   FLAG)   /*如果输入的数据不等于结束标志FLAG,则添加数据域为x的新结点*/
{
p   =   (LNode   *)malloc(sizeof(LNode));/*生成新结点*/
p-> StudentID=ID;/*新结点的数据域赋值为x*/
strcpy(p-> Student,name);
r-> next   =   p;/*将新结点连接到链表原来的尾结点上*/
r   =   p;   /*然后将尾指针变量指向新连接上的结点(即新结点成为了最后一个结点--尾结点)*/
printf( "请输入姓名: ");
scanf( "%s ",name);/*继续接受用户输入数据*/
printf( "\n ");
        printf( "请输入学号:   ");
        scanf( "%d ",&ID);
                printf( "\n ");
}
r-> next   =   NULL;/*尾结点的指针域赋为空值NULL*/
}

/*打印单链表的所有数据元素*/
void   print_linklist(LNode   *   L)
{
LNode   *   p;
p   =   L;/*p首先指向头结点*/
printf( "链表数据元素列表:\n ");
while   (p-> next   !=   NULL)/*如果p所指向的结点的指针域为NULL,则跳出打印循环*/
{
p   =   p-> next;/*p指向下一个结点*/
printf( "%ls   :%3d ",p-> Student,p-> StudentID);/*打印p所指向的结点的数据域--即线性表的数据元素*/
}
}

LNode   *   check_linklist(LNode   *   L,int   i)
  {
  LNode   *   p;
  int   j=0;
  p   =   L;
  while(p-> next   !=   NULL   &&   j   <   i   )
  {
  p   =   p-> next;
  j++;
  }
  printf( "你要查找的%d位置的学生是:   %ls ",i,p-> Student);
  if(j==i)
          return   p;
  else
return   NULL;
  }

  void   insert_linklist(LNode   *   p,LNode   *   p0,int   i)
  {
  char   name[10];
  int   ID;
  LNode   *   p1,*p2;
  p2   =   p0;
  p1   =   check_linklist(   p,i-1);
  if(p1!=NULL)
  {
                  p2   =   (LNode   *   )malloc(sizeof(LNode));//要插入的接点;
                  printf( "请输入要插入接点的基本信息---- ");
                  scanf( "姓名:%s     学号:%d ",&name,&ID);


                  strcpy(p-> Student,name);
                  p2-> StudentID   =   ID;
  p2-> next   =   p1-> next;
  p1-> next   =   p2;
  printf( "   OK\n ");
  }
  else
  printf( "ERROR ");

  }

void   main()
{
int   i;
        LNode   *   L   =   NULL;
        LNode   *   p   =   NULL;
LNode   *   p0   =   NULL;
        L   =   init_linklist();
        batch_append(   L);
        print_linklist(L);
printf( "输入你要查找的位置: ");
scanf( "%d ",&i);
        p   =   check_linklist(L,i);
printf( "请输入要插入的w: ");
scanf( "%d ",&i);
printf( "\n ");
insert_linklist(p,p0,i);//p0是要插入的接点

}

[解决办法]
..........?????????????不是写上去了吗???
[解决办法]
几个错误:
1、%ls---改为%s ,l是long缩写,不能用于字符串s前面;这是你输不出名字(字符串)的根本原因.
2、insert_linklist函数中scanf( "姓名:%s 学号:%d ",&name,&ID)语句不能作连续输入.请分开:printf( "姓名: ");
scanf( "%s ",&name);
printf( "学号: ");
scanf( "%d ",&ID);
3、指针有点混乱:main中的insert_linklist(p,p0,i) 应该是insert_linklist(L,p0,i);
insert_linklist中的strcpy(p-> Student,name)应该是strcpy(p2-> Student,name)
只看到这些了...

[解决办法]
稍微改了下,LZ看看.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FLAG 0
/*定义表示单链表结点的结构体类型,并取一个新的类型名LNode*/
typedef struct node
{
char Student[10];
int StudentID;
struct node * next;
}LNode;

/*初始化一个带头结点的单链表并返回其头指针(指向头结点的指针)*/
LNode * init_linklist()
{
LNode * p;
p = (LNode *)malloc(sizeof(LNode));
p-> next = NULL;/*尾结点的指针域赋为空值NULL,表示单链表结束*/
return p;
}

/*向单链表批量添加结点(从尾部添加)*/
void batch_append(LNode * L)
{
char name[10];
int ID;
LNode *r,*p;
r = L;/*尾结点指针变量首先指向头结点*/
while(r-> next != NULL)
{
r = r-> next;/*r指向尾结点*/
}
printf( "请输入姓名: ");
scanf( "%s ",name);
printf( "请输入学号: ");
scanf( "%d ",&ID);
while (ID != FLAG) /*如果输入的数据不等于结束标志FLAG,则添加数据域为x的新结点*/
{
p = (LNode *)malloc(sizeof(LNode));/*生成新结点*/
p-> StudentID=ID;/*新结点的数据域赋值为x*/
strcpy(p-> Student,name);
r-> next = p;/*将新结点连接到链表原来的尾结点上*/
r = p; /*然后将尾指针变量指向新连接上的结点(即新结点成为了最后一个结点--尾结点)*/
printf( "请输入姓名: ");
scanf( "%s ",name);/*继续接受用户输入数据*/
printf( "请输入学号: ");
scanf( "%d ",&ID);
}
r-> next = NULL;/*尾结点的指针域赋为空值NULL*/
}

/*打印单链表的所有数据元素*/
void print_linklist(LNode * L)
{
LNode * p;
p = L;/*p首先指向头结点*/
printf( "链表数据元素列表为:\n ");
while (p-> next != NULL)/*如果p所指向的结点的指针域为NULL,则跳出打印循环*/
{
p = p-> next;/*p指向下一个结点*/
printf( "%s:%3d\t ",p-> Student,p-> StudentID);/*打印p所指向的结点的数据域--即线性表的数据元素*/


}
}

LNode * check_linklist(LNode * L,int i)
{
LNode * p;
int j=0;
p = L;
while(p-> next != NULL && j < i )
{
p = p-> next;
j++;
}
printf( "你要查找的%d位置的学生是:%s ",i,p-> Student);
if(j==i)
return p;
else
return NULL;
}

LNode *insert_linklist(LNode * p,LNode * p0,int i)
{
char name[10];
int ID, j;
LNode * p1,*p2;
j = 0;
p2 = p0;
p1 = p;
//p1 = check_linklist( p,i-1);
while (p1-> next != NULL && j <i)
{
p1 = p1-> next;
j++;
}
if(p1!=NULL)
{
p2 = (LNode * )malloc(sizeof(LNode));//要插入的接点;
printf( "请输入要插入接点的基本信息----\n ");
printf( "请输入姓名: ");
scanf( "%s ", name);
printf( "请输入学号: ");
scanf( "%d ", &ID);
strcpy(p2-> Student,name);
p2-> StudentID = ID;
p2-> next = p1-> next;
p1-> next = p2;
printf( "插入成功! ");
return p;
}
else
{
printf( "ERROR ");
exit(1);
}

}

int main()
{
int i;
LNode * L = NULL;
LNode * p = NULL;
LNode * p0 = NULL;
L = init_linklist();
batch_append( L);
print_linklist(L);
printf( "\n输入你要查找的位置: ");
scanf( "%d ",&i);
p = check_linklist(L,i);
printf( "\n请输入要插入的位置: ");
scanf( "%d ",&i);
p = insert_linklist(L,p0,i);//p0是要插入的接点
printf( "插入后的 ");
print_linklist(p);

system( "pause ");
return 0;
}

热点排行
Bad Request.