01 链表
链表的基本实现与应用,差不多可以了
学生通讯录管理系统
#include <stdio.h>
#include "stdlib.h"
#include "string.h"
#define MAX 10
// 链表
typedef struct Node
{
int id, telenum;
char name[20];
int length;
struct Node *next;
} Node, *LinkList;
struct Node *head = NULL; // 头指针
struct Node *tail = NULL;
// ********************** 主界面 ********************************
void mainInterface()
{
printf("*************************欢迎使用通讯录系统******************************\n");
printf("* 1.通讯录的建立 *\n");
printf("* 2.插入通讯记录 *\n");
printf("* 3.查询通讯记录 *\n");
printf("* 4.删除通讯记录 *\n");
printf("* 5.显示通讯记录 *\n");
printf("* 0.退出管理系统 *\n");
printf("*************************欢迎使用通讯录系统******************************\n");
}
// ********************** 1.通讯录的建立 ********************************
LinkList creatIncreLink(LinkList L)
{
L = (Node *)malloc(sizeof(Node)); //
// head = *L; // 头指针指向头结点
// tail = *L;
L->length = 0;
L->next = NULL;
return L;
// L = new Node;
// // L = (Node *)malloc(sizeof(Node));
// head = L;
// tail = L;
// L->length = 0;
// L->next = NULL;
// return 0;
} // 就是初始化
// ********************** 2.插入通讯记录 ********************************
void insertYouXu(LinkList L) // 头插法创建单链表,创建完成后元素次序和输入时相反。引入尾插法
{
int num, tele;
char temp[20]; // 新插入的结点值
printf("输入需要插入的元素值:学号,姓名,电话号码(输入id为9999结束插入)\n");
scanf("%d%s%d", &num, temp, &tele);
while (num != 9999) // 输入999时表示结束
{
LinkList s = (Node *)malloc(sizeof(Node)); // 创建新结点
s->id = num; // 输入结点的值
s->telenum = tele;
// s->name=gets(temp);
strcpy(s->name, temp);
s->next = L->next;
L->next = s;
L->length++; // 单链表长度加一
scanf("%d%s%d", &num, temp, &tele);
}
printf("插入成功\n");
}
// ********************** 3.查询通讯记录 ********************************
/*前面两个子函数必须在这个“父级”函数之前
不然要申明!一开始就是不知道这个,且不懂得什么是声明花了无意义的时间*/
//(1)按学号查询
int searchNum(LinkList L)
{
printf("请输入要查找的学号id:\n");
int id;
LinkList p = L->next;
scanf("%d", &id);
while (p && p->id != id)
{
p = p->next;
}
if (p == NULL)
{
printf("你要查找的id号不存在!");
return 0;
}
printf("%-15d%-15s%-15d", p->id, p->name, p->telenum);
return 1;
}
// (2)按姓名查询
void searchName(LinkList L)
{
printf("请输入要查找的名字:\n");
}
void search(LinkList L)
{
printf("1.学号查询;2.姓名查询");
int x;
scanf("%d", &x);
switch (x)
{
case 1:
searchNum(L);
break;
case 2:
searchName(L);
break;
default:
break;
}
}
// ********************** 4.删除通讯记录 ********************************
/*
按照学号删除 -> 出了问题后,自己想出来的解决方案,虽然没看过别人的方法,也不一定比别人的好,但还是好爽
之后看了别人的,确实别人的更好
*/
void delNum(LinkList L)
{
printf("请输入要删除的学号id:\n");
int id;
scanf("%d", &id);
LinkList p, q;
p = L;
while (p->next && p->next->id != id)
{
p = p->next;
}
if (p->next == NULL)
{
printf("需要删除的元素不存在!\n");
}
q = p->next;
p->next = q->next;
free(q);
L->length--;
printf("删除完成!\n");
/* 这是一开始我的解决方法
p = L->next; // 不能这么做,不然删除不了首元节点,想想其他办法
if (p->id == x)
{
q = p;
p = L; // 返回上一个节点
p->next = q->next;
free(q);
L->length--;
printf("删除完成\n");
}
else
{
while (p && p->id != x)
{
temp = p;
p = p->next;
}
q = p; // 此时的q指向要被删除的p,q就是替罪羊
p = temp;
p->next = q->next;
free(q);
L->length--;
printf("删除完成\n");
}
*/
}
// 按照姓名删除
void delName(LinkList L)
{
printf("请输入要删除的姓名:\n");
/**
p = L->next;
if (!strcmp(p->name, a)) // 相等返回0,不相等返回1
{
q = p;
p = L;
p->next = q->next;
free(q);
L->length--;
printf("删除完成\n");
}
else
{
while (p && strcmp(p->name, a))
{
temp = p;
p = p->next;
}
q = p; // 此时的q指向要被删除的p,q就是替罪羊
p = temp;
p->next = q->next;
free(q);
L->length--;
printf("删除完成\n");
}
*/
}
void deleteList(LinkList L)
{
printf("1.学号删除;2.姓名删除 : ");
int x;
scanf("%d", &x);
switch (x)
{
case 1:
delNum(L);
break;
case 2:
delName(L);
break;
default:
break;
}
}
// ********************** 5.显示通讯记录 ********************************
void printList(LinkList L)
{
printf("----------------------------------------------------------\n");
printf("学号 姓名 电话号码\n");
printf("----------------------------------------------------------\n");
LinkList p = L->next;
while (p)
{
printf("%-15d%-15s%-15d\n", p->id, p->name, p->telenum);
p = p->next;
}
}
// ********************** 0.退出管理系统 ********************************
// ********************** 主函数 ********************************
int main()
{
LinkList L=NULL; // L是一个指针
mainInterface();
int option; // 进行选择
do
{
printf("请选择你要进行的操作:\n");
scanf("%d", &option);
switch (option)
{
case 1:
L=creatIncreLink(L); // 对L
printf("通讯录建立完成\n");
break;
case 2:
insertYouXu(L);
printf("插入通讯记录结束\n");
break;
case 3:
printf("查询通讯记录\n");
search(L);
break;
case 4:
printf("删除通讯记录\n");
deleteList(L);
break;
case 5:
printf("显示通讯记录\n");
printList(L);
break;
default:
break;
}
} while (option != 0);
printf("\n退出通讯录管理系统!");
return 0;
}