因为写入访问权限受阻而无法成功输入数据。之前曾经写过另外一个方法,那个方法是将首指针也存入了数据,但是我将输入的数据即时输出(即读入)时是正确的,后面进行交换却是错的,因此重新写了一份,也就是这一份,首指针为空不存入数据,输入后后面交换时数值时正确的(调试),但是一到后面就不对了,查了csdn的相关类似问题,结果就是大部分都是数组越界,但是我检查了逻辑,确实是写一个就加一个,应该不可能越界,其他答案也无法解决我的问题。想要一份通俗易懂些的答案,之前都没接触过链表,实在是搞不明白到底哪里错了。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
# define WHY printf("***\n");
#pragma warning (disable:4996)
typedef struct ren//创建结构体
{
char n[20];
char sex;
int cg;
struct ren* next;
}STU;
STU* create()
{
STU* head;
head = (STU*)malloc( sizeof(STU));
head->next = NULL;
return head;
}
void tail(STU* pH, STU* new)
{
STU* p = pH;
while (NULL != p->next)
{
p = p->next;
}
p->next = new;
}
void top(STU* pH, STU* new)
{
STU* p = pH;
new->next = p->next;
p->next = new;
}
void output(STU* pH)
{
STU* p = pH;
p = p->next;
while (NULL != p->next)
{
printf("姓名\t性别\t成绩\t");
printf("%s\t%c\t%d\t", p->n, p->sex, p->cg);
p = p->next;
}
printf("姓名\t性别\t成绩\t");
printf("%s\t%c\t%d\t", p->n, p->sex, p->cg);
}
void delete(STU* pH, int *c)
{
STU* p = pH;
STU* prev = NULL;
char a[20];
while (NULL != p->next)
{
prev = p;
p = p->next;
scanf("%s", a);
if (strcmp(p->n,a))
{
if (p->next != NULL)
{
prev->next = p->next;
free(p);
(*c)--;
}
else
{
prev->next = NULL;
free(p);
(*c)--;
}
return 0;
}
}
printf("没有要删除的节点\n");
}
void new(STU* qH ,int *c){
STU*q=qH,*qb;
printf("请输入数据\n");
STU* p = (STU*)malloc(sizeof(STU));
if (NULL == p)
{
printf("malloc error!\n");
return NULL;
}
printf("姓名:\t");
scanf("%s", (p->n));
printf("性别(m为男,w为女):\t");
scanf(" %c", &(p->sex));
printf("成绩:\t");
scanf("%d", &(p->cg));
printf("姓名\t性别\t成绩\t\n");
printf("%s\t%c\t%d\t\n", p->n, p->sex, p->cg);
p->next = NULL;
(*c)++;
int n, i;
add:printf("请问您要插入数据还是直接添加到尾部?1.插入,2.添加\n");
scanf("%d", &n);
if (n == 1)
{
printf("请输入您要插入的位置:(从1开始)\n");
scanf("%d", &i);
if (*c >= i) {
if (*c == i&&i!=1)
{
tail(q, p);
}
else
{
for (int x = 1; x < i; x++)
q = q->next;
qb = q->next;
q->next = p;
p->next = qb;
}
}
}
if (n == 2)
{
if ((*c) == 1)
{
q->next = p;
p->next = NULL;
}
else {
while (NULL != q->next)
{
q = q->next;
}
p->next = q->next;
q->next = p;
}
}
else
{
printf("输错啦,请重新输入:退出请按0\n");
scanf("%d", &n);
if (n == 0)
{
return;
(*c)--;
}
goto add;
}
}
void change(STU*qH, int* c) {
STU* q = qH;
int n, i;
char a[20];
printf("请输入您要修改的人的姓名\t");
scanf("%s", a);
q = q->next;
while (!strcmp(q->n,a))
{
q = q->next;
}
printf("姓名\t性别\t成绩\t");
printf("%s\t%c\t%d\t",q->n,q->sex,q->cg);
printf("请输入你要改变的内容:1.改变姓名,2.改变性别,3.改变C语言成绩,0.退出修改程序\n");
scanf("%d", &n);
switch (n)
{
case 1:printf("请输入:\n"); scanf("%s", q->n);; break;
case 2:printf("请输入:\n"); scanf(" %c", q->sex); break;
case 3:printf("请输入:\n"); scanf("%d", q->cg); break;
case 0:break;
default:printf("输错了,请重新输入\n"); break;
}
}
void question(STU* qH, int* c) {
STU* q = qH, * p;
char a[20];
printf("请输入查询的人的姓名:\n");
scanf("%s", &a);
p = q;
q = q->next;
while (q->next==NULL&&!strcmp(q->n, a))
{
p = q;
q = q->next;
}
if (q->next = NULL)
{
printf("查无此人,请重新输入吧!\n");
return;
}
printf("姓名\t性别\t成绩\t");
printf("%s\t%c\t%d\t", q->n, q->sex, q->cg);
}
void main()
{
int count = 0, a = 1, * c;
c = &count;
struct ren* q = create;
main:while (a)//重复使用
{
int a;
printf(" ***************************************************************\n");
printf(" * 使用学生数据管理系统 *\n");
printf(" * 输入1添加新学生 *\n ");
printf("* 输入2修改学生信息 *\n ");
printf("* 输入3查询学生信息(输入姓名) *\n ");
printf("* 输入4删除学生 *\n ");
printf("* 输入5显示所有学生 *\n ");
printf("* 输入0退出系统 *\n ");
printf("***************************************************************\n");
scanf("%d", &a);
switch (a)
{
case 1:new(q, c); break;//计数几个人
case 2:change(q, c); break;//先查询否有这个人再修改
case 3:question(q, c); break;
case 4:delete(q, c); break;
case 5:output(q, c); break;
case 6:break;
}
}
}
以下为结果
1
请输入数据
姓名: lili
性别(m为男,w为女): m
成绩: 90
姓名 性别 成绩
lili m 90
请问您要插入数据还是直接添加到尾部?1.插入,2.添加
1
请输入您要插入的位置:(从1开始)
1