本帖最后由 jackz007 于 2019-9-23 00:17 编辑
这是我系统地为你修改的代码,新增加了几个函数,你测试一下,看看能否解决你的问题。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student {
int num ;
char name[20] ;
struct student * pnext ;
} stu ;
int strip(char * s)
{
int b , k , m ;
m = strlen(s) ;
while(m > 0 && (s[m - 1] == 0x07 || s[m - 1] == 0x0a || s[m - 1] == 0x0d || s[m - 1] == 0x20)) {
s[m - 1] = 0x00 ;
m -- ;
}
if(m > 0) {
b = 0 ;
while(b < m && (s[b] == 0x07 || s[b] == 0x0a || s[b] == 0x0d || s[b] == 0x20)) b ++ ;
if(b > 0 && b < m) {
for(k = b ; k < m ; k ++) s[k - b] = s[k] ;
s[m - b] = 0x00 ;
m -= b ;
}
}
return m ;
}
int getnum(int * num)
{
int m , ret ;
char s[260] ;
ret = 0 ;
* num = ret ;
for(;;) {
printf("输入学号 : ") ;
fgets(s , 256 , stdin) ;
if(strip(s)) {
if(sscanf(s , "%d" , & m) == 1) {
ret = m ;
* num = ret ;
break ;
} else {
fprintf(stderr , "输入错误!\n\n") ;
}
} else {
break ;
}
}
return ret ;
}
char * getname(char * name)
{
char s[260] , * ret ;
name[0] = '\0' ;
ret = name ;
printf("输入姓名 : ") ;
fgets(s , 256 , stdin) ;
if(strip(s)) strcpy(name , s) ;
return ret ;
}
stu * findnode(int num , stu * p)
{
stu * ret ;
ret = NULL ;
while(p) {
if(p -> num == num) {
ret = p ;
break ;
} else {
p = p -> pnext ;
}
}
return ret ;
}
stu * addnode(stu * p)
{
int num ;
stu * h , * q ;
char name[20] ;
bool f ;
f = true ;
h = p ;
printf("\n") ;
printf("*** 录入学员信息 ***\n") ;
for(; f ;) {
p = h ;
printf("\n") ;
if(getnum(& num)) {
if(! findnode(num , p)) {
if(strlen(getname(name))) {
q = (stu *) malloc(sizeof(stu)) ;
q -> num = num ;
strcpy(q -> name , name) ;
q -> pnext = NULL ;
if(p) {
while(p -> pnext) p = p -> pnext ;
p -> pnext = q ;
} else {
p = q ;
h = p ;
}
} else {
f = false ;
}
} else {
fprintf(stderr , "错误:节点已经存在!\n\n") ;
}
} else {
f = false ;
}
}
return h ;
}
stu * delnode(stu * p)
{
int num ;
stu * h , * q ;
bool f ;
f = true ;
printf("\n") ;
printf("*** 删除学员信息 ***\n") ;
h = p ;
if(p) {
for(; f ;) {
if(h) {
p = h ;
printf("\n") ;
if(getnum(& num)) {
if((q = findnode(num , p))) {
while(p != q && p -> pnext && p -> pnext != q) p = p -> pnext ;
if(p == q || p -> pnext == q) {
if(p == q) h = p -> pnext ;
else p -> pnext = q -> pnext ;
free(q) ;
}
} else {
fprintf(stderr , "错误:节点未找到!\n\n") ;
}
} else {
f = false ;
}
} else {
printf("\n") ;
printf("链表节点已经全部删除!\n\n") ;
f = false ;
}
}
} else {
fprintf(stderr , "错误:链表为空!\n\n") ;
}
return h ;
}
void print(stu * p)
{
printf("\n") ;
printf("*** 显示学员信息 ***\n") ;
if(p) {
while(p) {
printf("%d\t%s\n" , p -> num , p -> name) ;
p = p -> pnext ;
}
} else {
fprintf(stderr , "错误:链表为空!\n\n") ;
}
}
int main(void)
{
stu * p ;
p = NULL ;
p = addnode(p) ;
print(p) ;
p = delnode(p) ;
print(p) ;
}
这个代码花了比较大的力气在键盘输入检测方面,任何时候,如果从键盘获取的参数是空回车,则随时结束输入。 |