C语言单链表的基本操作
该程序是对一个图书信息的基本管理系统,包括创建、插入、删除和输出。代码十分简单,而且有许多可以优化的地方,对于一些不当输出也没有给出相应的回应,仅供各位参考。
下面展示我的代码。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node{
char name[20];//书名
char ISBN[20];//编号
char price[10];//价格
}Node,*Linklist;//定义结构体,其实*Linklist没有定义的必要。
typedef struct Book{
Node date;
struct Book*next;
}book, *Linklist1;
Linklist1 CreatLink()//单链表的创建
{
Linklist1 h, tail, p;
h=tail=(book*)malloc(sizeof(book));//申请内存
h->next = NULL;
int n = 0;
printf("输入要录入书的数目:");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
p = (book*)malloc(sizeof(book));
printf("书名:");
scanf("%s",p->date.name);
printf("IBSN:");
scanf("%s",p->date.ISBN);
printf("价格:");
scanf("%s",p->date.price);
p->next = NULL;
tail->next = p;
tail = p;
printf("录入成功\n");
}
return h;
}
Linklist1 Insert(Linklist1 h)//头插法
{
Linklist1 q,p=h->next;
int i=0;
q = (book*)malloc(sizeof(book));
printf("输入要插入的书名:");
scanf("%s",q->date.name);
while (p!=NULL)
{
if (strcmp(p->date.name,q->date.name)==0)//判断该书是否存在。
{
i=1;
printf("该书已存在\n");
break;
}
else
p=p->next;
}
if(i==0)
{
printf("输入要插入的IBSN:");
scanf("%s",q->date.ISBN);
printf("输入要插入的价格:");
scanf("%s",q->date.price);
q->next = h->next;
h->next = q;
printf("插入成功\n");
}
return h;
}
void Search1(Linklist1 h)//书名查找
{
char name[20];
Linklist1 p = h->next;
printf("输入要查找的书名:");
scanf("%s",name);
while (p!=NULL)
{
if (strcmp(p->date.name,name)!=0)
{
p = p->next;
}
else
{
printf("书名:%s\t",p->date.name);
printf("IBSN:%s\t", p->date.ISBN);
printf("价格:%s\t", p->date.price);
printf("\n");
return;
}
}
if (p == NULL)
{
printf("没有查询到!\n");
}
}
void Search2(Linklist1 h)//ISBN查找
{
char ISBN[20];
Linklist1 p = h->next;
printf("输入要查找的ISBN:");
scanf("%s", ISBN);
while (p != NULL)
{
if (strcmp(p->date.ISBN, ISBN)!=0)
{
p = p->next;
}
else
{
printf("书名:%s\t",p->date.name);
printf("IBSN:%s\t", p->date.ISBN);
printf("价格:%s\t", p->date.price);
printf("\n");
return;
}
}
if (p == NULL)
{
printf("没有查询到!\n");
}
}
void PrintLink(Linklist1 h)//输出
{
Linklist1 p;
for (p = h->next; p != NULL; p = p->next)
{
printf("书名:%s\t",p->date.name);
printf("IBSN:%s\t", p->date.ISBN);
printf("价格:%s\t", p->date.price);
printf("\n");
}
}
void delete1(Linklist1 h)//按ISBN删除.
{
char ISBN[20];
Linklist1 p = h->next;
Linklist1 tail = h;//为了后面的删除操作
int n=0;
printf("输入要删除书的ISBN:");
scanf("%s", ISBN);
while (p != NULL)
{
if (strcmp(p->date.ISBN, ISBN)!=0)
{
p = p->next;
tail = tail->next;
}
else
{
tail->next = p->next;
free(p);
printf("删除成功\n");
n=1;
break;
//return;
}
}
if(n==0)
printf("删除失败\n");
}
void delete2(Linklist1 h)//按书名删除
{
char name[20];
Linklist1 p = h->next;
Linklist1 tail = h;
int n=0;
printf("输入要删除书的书名:");
scanf("%s", name);
while (p != NULL)
{
if (strcmp(p->date.name, name)!=0)
{
p = p->next;
tail = tail->next;
}
else
{
tail->next = p->next;
free(p);
printf("删除成功\n");
n=1;
break;
}
}
if(n==0)
printf("删除失败\n");
}
void menu()
{
printf("---------图书管理系统---------\n");
printf("************1.录入************\n");
printf("************2.插入************\n");
printf("************3.按书名查询******\n");
printf("***********4.按ISBN查询*******\n");
printf("************5.按IBSN删除************\n");
printf("************6.按书名删除************\n");
printf("************7.输出************\n");
printf("注:只录入一次,否则会覆盖\n");
}
void choose(Linklist1 h)
{
int i;
int a = 1;
while (a>0)
{
menu();
printf("请选择:");
scanf("%d",&i);
switch (i)
{
case 1:
h=CreatLink();
break;
case 2:
h=Insert(h);
break;
case 3:
Search1(h);
break;
case 4:
Search2(h);
break;
case 5:
delete1(h);
break;
case 6:
delete2(h);
break;
case 7:
PrintLink(h);
break;
default:
printf("无效的命令!\n");
a = -1;//跳出循环条件
break;
}
}
}
int main()
{
Linklist1 head = NULL;
choose(head);
return 0;
}