学生通讯录管理系统
建立某班学生的通讯录,要求用链表存储。
具体功能包括:
1)可以实现插入一个同学的通讯录记录;
2)能够删除某位同学的通讯录;
3)对通讯录打印输出。
设计要求:
(1)定义通讯录内容的结构体;
(2)建立存储通讯录的链表结构并初始化;
(3)建立主函数:
1)建立录入函数(返回主界面)
2)建立插入函数(返回主界面)
3)建立删除函数(返回主界面)
4)建立输出和打印函数(返回主界面)
I)通过循环对所有成员记录输出
II)输出指定姓名的某个同学的通讯录记录
5)退出
写了半天改了半天还是没看出来哪错了,求帮忙看一下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedef struct stu
{
long long nmber;
char name[10];
struct stu* next;
}student;
student* init()
{
return NULL;
}
student* get_num(student* head)
{
int flag;
head = (student*)malloc(sizeof(student));
student* q, * p = head;
p->next = NULL;
printf("请输入第一个同学的数据(姓名、手机号)\n");
char nam[10];
int i = 2;
flag = scanf_s("%s", nam);
while (1)
{
scanf_s("%lld", &p->nmber);
strcpy_s(p->name, nam);
printf("请输入第%d个同学的信息:\n", i++);
flag = scanf_s("%s", nam);
if (flag == 1)
{
q = (student*)malloc(sizeof(student));
q->next = NULL; p->next = q; p = q;
}
else break;
}
return head;
}
student* insert(student* head, int position)
{
int flag;
char nam[10];
student* p = head, * q = NULL;
if (position < 1)
{
printf("输入位置有误!");
exit(1);
}
q = (student*)malloc(sizeof(student));
printf("请输入增加的学生的姓名、手机号:\n");
flag = scanf_s("%s", nam);
scanf_s("%lld", &q->nmber); q->next = NULL;
if (flag == 1)
strcpy_s(q->name, nam);
if (position == 1)
{
if (!p)
{
printf("通讯录为空!\n");
exit(1);
}
else
{
q->next = p; return q;
printf("插入成功!\n");
}
}
else
{
for (int i = 1; p; i++)
{
if (i + 1 == position)
{
q->next = p->next;
p->next = q;
printf("插入成功!\n");
return head;
}
}
if (!p)
{
printf("未找到增加的位置!\n");
return head;
}
}
}
student* del(student* head, int position)
{
student* p = head, * q = NULL;
if (!p)
{
printf("删除失败,链表为空!\n");
}
if (position < 1)
{
printf("删除失败,输入的位置有误!\n");
return head;
}
if (position == 1)
{
if (p->next)
{
q = p;
head = p->next;
free(q);
return head;
}
printf("删除成功!\n");
}
for (int i = 1; p; i++)
{
if (i + 1 == position && p->next)
{
q = p->next;
p->next = p->next->next;
free(q);
return head;
}
p = p->next;
printf("删除成功!\n");
}
if (!p)
{
printf("删除失败,该位置处无元素!\n");
}
}
void display(student* head)
{
student* p = head;
if (!p)
{
printf("链表为空!\n");
exit(1);
}
else
while (p)
{
printf("%-20s %-12lld\n", p->name, p->nmber);
p = p->next;
}
}
void main()
{
int order, position;
student* head = init();
head = get_num(head);
printf("请输入你要的操作(1.插如一个同学,2.删除某个同学的信息,3.输出同学们的信息):");
scanf_s("%d", &order);
if (order == 1)
{
printf("请输入要插入的节点位置:\n");
scanf_s("%d", &position);
head = insert(head, position);
}
if (order == 2)
{
printf("请输入要删除节点的值:\n");
scanf_s("%d", &position);
head = del(head, position);
}
if (order == 3)
{
printf("输出结果为:\n");
display(head);
}
}
构建时正常,输入数据后如图报错
本人初学者,可能会犯很多低级错误,求各位斧正