这个代码的问题在于我输入第一个数据后无法查询第一个数据,要插入第二个数据才能查第一个数据,但第二个数据又不能查找了,插入三个数据也是只有一个数据可以完成查询,知识有限,无法改正,如果能帮忙,多谢!
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "stdlib.h"
/*结构体定义Book,将名字、作者、出版社、ISBN号、价格定义成数组并储存进去 */
typedef struct Book {
char name[50];
char author[20];
char press[30];
char ISBN[20];
float price;
struct Book* next;/*定义下一本书的后继结点,用于构建单链表*/
}Book;/*结构体变量*/
Book* head = NULL;/*头结点,全局变量*/
/*1实现插入函数*/
void insert()
{
/*动态分配内存*/
Book* p = (Book*)malloc(sizeof(Book));
/*记录插入书籍的信息*/
printf("请输入书名:\n"); scanf_s("%s", p->name, 50);
printf("请输入作者名:\n"); scanf_s("%s", p->author, 20);
printf("请输入出版社:\n"); scanf_s("%s", p->press, 30);
printf("请输入ISBN号:\n"); scanf_s("%s", p->ISBN, 20);
printf("请输入价格:"); scanf_s("%f", &p->price);
/*插入后续结点*/
p->next = head;
head = p;
}
/*2实现查询函数*/
void search()
{
char word[50];
printf("请输入关键字:");
scanf_s("%s", word, 50);
Book* p = head->next;
while (p != NULL)
{
/*查询关键步骤,运用程序strcmp比较实现查找*/
if (strcmp(p->name, word) == 0 || strcmp(p->author, word) == 0 || strcmp(p->ISBN, word) == 0)
{
printf("%s %s %s %s %f\n", p->name, p->author, p->press, p->ISBN, p->price);
}
p = p->next;/*及时填空,终止while语句*/
return 0;
}
printf("未找到此图书\n");
}
/*3实现删除函数*/
void delete()
{
char ISBN[20];
printf("请输入ISBN号:"); scanf_s("%s", ISBN, 20);
Book* p = head->next; Book* previous = head;/*记录前一个结点,便于删除*/
while (p != NULL)
{
if (strcmp(p->ISBN, ISBN) == 0)/*一个为结构体中的ISBN,一个是该函数定义的数组*/
{
head->next = p->next;
free(p);
printf("删除成功!\n");
return 0;
}
previous = p;
p = p->next;
}
printf("未找到对应图书信息!\n");
}
/*4实现修改函数*/
void modify()
{
char ISBN[20];
printf("请输入ISBN号:"); scanf_s("%s", ISBN, 20);
Book* p = head->next;
while (p != NULL)
{
if (strcmp(p->ISBN, ISBN) == 0)
{
printf("请输入书名:"); scanf_s("%s", p->name, 50);
printf("请输入作者名:"); scanf_s("%s", p->author, 20);
printf("请输入出版社:"); scanf_s("%s", p->press, 30);
printf("请输入价格:"); scanf_s("%f", &p->price);
printf("修改成功!\n");
return 0;
}
p = p->next;
}
printf("未找到对应图书信息!\n");
}
/*主函数*/
int main()
{
head = (Book*)malloc(sizeof(Book));/*创建头结点*/
head->next = NULL;
int choice;
do
{
printf("====图书管理系统====\n");
printf("1.插入新的图书信息\n");
printf("2.查询图书信息\n");
printf("3.删除图书信息\n");
printf("4.修改图书信息\n");
printf("0.退出系统\n");
printf("请输入您的选择:\n");
scanf_s("%d", &choice);
/*操作系统程序*/
switch (choice)
{
case 1:insert(); break;
case 2:search(); break;
case 3:delete(); break;
case 4:modify(); break;
case 0:printf("欢迎再次使用!\n");
break;
default:printf("输入有误,请重新输入!\n"); break;
}
} while (choice != 0);
return 0;
}
main()里面head是一个空book,第一个节点没具体内容
insert()里面,新book放链首,即链表最后一个节点没具体内容
search()里面,初始p=head->next,即从得二个节点开始查。如果找到一本就结束,return放if里面;如果找出所有的,就加一个布尔变量,找到后设置为true,循环结束布尔为false才输出没找到
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define FLAG -1 //停止输入的标志
typedef struct Node
{
int data;
struct Node * next;
}LNode,*LinkList;
void CreateLinkList(LinkList L);
void show_List(LinkList L);
LNode *Breakupthelist(LinkList La,int *A,int *B);
void main()
{
LinkList La,Lb;
int A = 0,B = 0;
La = (LinkList)malloc(sizeof(LNode));//创建头结点
printf("创建单链表:\n");
CreateLinkList(La);
printf("遍历单链表:\n");
show_List(La);
printf("拆分链表:\n");
Lb = Breakupthelist(La,&A,&B);//A,B用来判断全是奇数或全是偶数的情况
if(A == 0)//全是偶数
{
printf("偶数链:\n");
show_List(La);
printf("奇数链为空!\n");
}
else if(B == 0)//全是奇数
{
printf("奇数链:\n");
show_List(Lb);
printf("偶数链为空!\n");
}
else
{
printf("偶数链:\n");
show_List(La);
printf("奇数链:\n");
show_List(Lb);
}
}
void CreateLinkList(LinkList L) //尾插法 输出是输入的正序
{
LinkList s,r;
int x;
scanf("%d",&x);
r = L;
while(x != FLAG)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
}
void show_List(LinkList L)
{
LinkList p = L->next;
printf("%d",p->data);
p = p ->next;
while(p != NULL)
{
printf("->%d",p->data);
p = p->next;
}
printf("\n");
}
LNode *Breakupthelist(LinkList La,int *A,int *B) //返回奇数链表的头结点
{
LinkList p,q,r;//r始终指向偶数链的尾部
LinkList Lb = (LinkList)malloc(sizeof(LNode));
p = La;
q = Lb;
r = La;
p = p->next;
while(p)
{
if(p->data % 2 != 0) //奇数
{
q->next = p;
p = p->next;
r->next = p;
q = q->next;
*A = 1;
}
else
{
p = p->next;
r = r->next;
*B = 1;
}
}
q->next = NULL;
return Lb;
}