这题怎么做啊`````我做的输不出字符串,怎么回事?
用链表实现一个学生名单记录表(学生信息至少包括学号、姓名),并实现打印、查找、添加等操作,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;
}