正文
本程序使用带头节点的单链表存储结构实现,共有六个基本功能,完成对信息链表的增删改查。
注意
/*
1.对于结构体或自定义元素类型最好传地址,传值的话会涉及到内存拷贝。
2.函数memset()与memcpy()是c/c++中的内存初始化和内存拷贝函数,数据元素是结构体变量时也适用,初始化或者赋值时不需要对结构体内数据元素进行一个一个的赋值。
函数解释:
(1).void *memset(void *s, int ch, size_t n);
将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
(2).void *memcpy(void *destin, void *source, unsigned n);
从源source所指的内存地址的起始位置开始拷贝n个字节到目标destin所指的内存地址的起始位置中。
3.system(“color f1”);//调整背景颜色与字符颜色
头文件是 #include<windows.h>
**/
部分功能运行展示
1.插入信息功能:
2.清除信息功能
3.退出系统功能
所包含头文件及结构体的定义
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
int seat;//定义一个全局变量,保存结点的位置序号
//定义结构体数据元素。
typedef struct{
int num; //定义图书编号。
char name[31]; //定义图书名字。
}ElemType;
//定义链表节点结构体。
typedef struct LNode{
ElemType data; // 加入一个自定义数据元素 用来存放数据。
struct LNode *next; //定义一个节点类型指针,后续让它指向该节点的下一结点。
}LNode,*LinkList;
自定义函数
// 初始化链表LL,返回值:成功-头结点的地址,失败-NULL。
LNode *InitList();
// 销毁链表LL。
//注意链表的销毁操作最后需要将链表指针也置空。
void DestroyList(LinkList LL);
// 清空链表。
//清空链表需要保留头指针。
void ClearList(LinkList LL);
//打印链表。
void PrintList(LinkList LL);
//在链表中第seat个位置插入元素,返回值:成功-1,失败-0。
int InsertList(LinkList LL,unsigned int seat,ElemType *ee);
//在链表第一个位置添加元素,返回值:成功-1,失败-0。
int PushFront(LinkList LL,ElemType *ee);
//在链表最后一个位置添加元素。
void PushBack(LinkList LL,ElemType *ee);
//在链表中第seat个位置删除元素,返回值:成功-1,失败-0。
int DeleteList(LinkList LL,unsigned int seat,ElemType *ee);
// 通过元素信息删除表中节点
void DeleteNode(LinkList LL,ElemType *ee);
//根据编号寻找结点位置,返回值:成功-结点位置,失败-0。
int LocateList(LinkList LL,int ii);
主函数
int main()
{
LinkList LL;//声明一个链表。
LL=NULL;
ElemType ee;//声明一个自定义元素。
LL=InitList();//对链表进行初始化。
int choose,ii; //choose保存主要功能选择号码,ii用于保存次要功能选择号码。
char name_tmp[31];
system("color f1");//调整背景颜色与字符颜色
//条件始终为真的循环。
while(1){
printf("\n");
printf("---------------------------------\n");
printf("* 欢迎使用图书管理系统 *\n");
printf("* 1.查看所有图书信息 *\n");
printf("* 2.添加图书信息 *\n");
printf("* 3.删除图书信息 *\n");
printf("* 4.修改图书信息 *\n");
printf("* 5.清空图书信息 *\n");
printf("* 6.退出系统 *\n");
printf("---------------------------------\n");
printf("\n");
printf("请选择功能选项(1-6):\n");
scanf("%d",&choose);
switch(choose){
case 1:
PrintList(LL); //打印链表。
break;
case 2:
printf("请插入图书信息(输入为0时停止插入):\n");
printf("请输入要插入的图书编号:\n");
scanf("%d",&ee.num);
printf("请输入要插入的图书名:\n");
scanf("%s",&name_tmp); strcpy(ee.name,name_tmp);
while(ee.num!=0)
{
printf("请选择要添加图书信息的位置(1-添加在第一个,2-添加在末尾,3-自定义位置):\n");
scanf("%d",&ii);
if(ii == 1) PushFront(LL,&ee);//在链表第一个位置添加元素 。
if(ii == 2) PushBack(LL,&ee);//在链表最后一个位置添加元素。
if(ii == 3)
{
printf("请输入插入位置:\n");
scanf("%d",&seat);
InsertList(LL,seat,&ee);//在链表中第ii个位置插入元素,返回值:成功-1,失败-0。
}
printf("请插入图书信息(输入为0时停止插入):\n");
printf("请输入要插入的图书编号:\n");
scanf("%d",&ee.num