if (name != '$' && number != 0 && score != 0) 这都不对的。name是字符串,'$'是字符啊。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define ERROR 0
#define OK 1
typedef struct Stu_Node {
char name[20];
int number;
float score;
struct Stu_Node* next;
}Stu_Node, * LinkList;
//初始化
LinkList InitList(LinkList L)
{
L = (LinkList)malloc(sizeof(Stu_Node));
L->next = NULL;
return L;
}
//头插
void CreateFromHead(LinkList L)
{
Stu_Node* s;
int flag = 1;
char name[20];
int number;
float score;
while (flag)
{
printf("请输入学生信息:");
scanf("%s %d %f", &name, &number, &score);
if (strcmp(name,"$") != 0 && number != 0 && score != 0)
{
s = (Stu_Node*)malloc(sizeof(Stu_Node));
strcpy(s->name, name);
s->number = number;
s->score = score;
s->next = L->next;
L->next = s;
}
else flag = 0;
}
}
//查找
//查找第i个结点,
Stu_Node* Get(LinkList L, int i)
{
Stu_Node* p;
int j = 1;
p = L;
while (p->next != NULL && j < i)
{
p = p->next;
j++;
}
if (i == j)
{
printf("你要查找的学生信息为:姓名:%s 学号:%d 成绩:%f\n", p->name, p->number, p->score);
return p;
}
return NULL;
}
//查找值等于key的结点
Stu_Node* Locate(LinkList L, int number)
{
Stu_Node* p;
p = L->next;
while (p != NULL)
{
if (p->number != number)
p = p->next;
else
break;
}
if(p!=NULL)
printf("你要查找的学生信息为:姓名:%s 学号:%d 成绩:%f\n", p->name, p->number, p->score);
return p;
}
//插入
int InsList(LinkList L, int i, char *name, int number, float score)
{
Stu_Node* pre, * s;
int k;
pre = L;
k = 0;
while (pre != NULL && k < i - 1)
{
pre = pre->next;
k++;
}
if (k != i - 1)
{
printf("插入的位置不合理");
return ERROR;
}
s = (Stu_Node*)malloc(sizeof(Stu_Node));
strcpy(s->name, name);
s->number = number;
s->score = score;
s->next = pre->next;
pre->next = s;
return OK;
}
//删除
int DelList(LinkList L, int i, char name[],int *number,float *score)
{
Stu_Node* p, * r;
int k;
p = L;
k = 0;
while (p->next != NULL && k < i - 1)
{
p = p->next;
k++;
}
if (k != i - 1)
{
printf("删除结点的位置i不合理");
return ERROR;
}
r = p->next;
p->next = p->next->next;
strcpy(name,r->name);
// name = r->name;
*number = r->number;
*score = r->score;
free(r);
return OK;
}
//求链表长度
int ListLength(LinkList L)
{
Stu_Node* p;
p = L->next;
int j = 0;
while (p != NULL)
{
p = p->next;
j++;
}
printf("学生的总人数为%d", j);
return j;
}
//输出
void Printlist(LinkList L)
{
printf("学生链表的内容为:\n");
printf("姓名 学号 成绩\n");
L = L->next;
while (L != NULL)
{
printf("%s %d %f\n", L->name, L->number, L->score);
L = L->next;
}
}
int main()
{
LinkList L = NULL;
int i;
int x;
char name[20];
int number;
float score;
char name1[20];
int *number1=NULL;
float *score1=NULL;
L = InitList(L);
printf("头插法创建学生链表\n");
CreateFromHead(L);
Printlist(L);
printf("请输入要查询学生的序号:");
scanf("%d", &i);
Get(L,i);
printf("请输入要查询的学生的学号:");
scanf("%d", &number);
Locate(L,number);
printf("请输入要插入的位置及要插入的学生信息:");
scanf("%d %s %d %f", &x, &name, &number, &score);
InsList(L, x, name, number, score);
Printlist(L);
printf("请输入要删除的学生序号及信息:");
scanf("%d &s %d %f",&i,&name, &number,&score);
DelList(L, i, name1, number1, score1);
Printlist(L);
ListLength(L);
}