该代码是基于网上其他代码修改而来,原来的代码有错误,以下是我修改后并在CentOS上调试成功的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define LEN sizeof(struct student)
struct student{
int num;
char name[10];
float score;
struct student *next;
};
static unsigned inode = 1;
void fill(char c[], int n, char ch);//填充数组
void del(struct student *ph, int n);//删除指定序号的节点
void insert(struct student *ph, int n);//在指定序号后插入节点
void output(struct student *ph);//输出所有节点
struct student *input(void);//输入新节点
void clearline(int n);//分割线
int main(){
struct student *head,*ps,*pa,*pb;
int u;
char flag = 'y';
head = ps = pa = (struct student *)malloc(LEN);
fill(pa->name,10,'\0');
//输入数据,建立链表
while(flag != 'n'){
printf("please input student informations: \n");
printf("Num\tName\tScore\n");
scanf("%d %s %f", &pa->num, pa->name, &pa->score);
flag = getchar();
printf("Press any key input data continue, otherwise press n quit:");
flag = getchar();
if(flag != 'n'){
clearline(60);
pa->next = (struct student *)malloc(LEN);
pa = pa->next;
fill(pa->name,10,'\0');
inode++;
}
}
pa->next = NULL;
output(ps);
//删除节点
printf("which student's num do you want to del?\n");
printf("please input the num that you want to del:");
scanf("%d", &u);
if(u > inode){
printf("input error!\n");
exit(1);
}
if(u == 1){
pb = head;
ps = head->next;
free(pb);
head = pb = pa = ps;
}else
del(ps,u);
output(ps);
//插入节点
printf("which student's num do you want to insert after:");
scanf("%d",&u);
if(u>inode){
printf("input error!\n");
exit(1);
}
if(u == 0){
pb = head;
head = ps = pa = input();
pa->next = pb;
inode++;
}else{
insert(ps, u);
}
output(ps);
return 0;
}
void fill(char c[], int n, char ch){
int i;
for(i=0;i<=n;i++){
*(c+i) = ch;
}
}
void del(struct student *ph, int n){
int i;
struct student *pb,*pf;
pb = pf = ph;
for(i=1;i<=n-2;i++){
ph = ph->next;
}
if(n == inode){
pb = ph->next;
ph->next = NULL;
free(pb);
}else{
pb = ph->next;
ph->next = (ph->next)->next;
free(pb);
}
inode--;
}
void insert(struct student *ph, int n){
int i;
struct student *pa,*pb,*p_new,*ps;
ps = pa = ph;
p_new = (struct student *)malloc(LEN);
fill(p_new->name,10,'\0');
printf("please input the new student informations:\n");
printf("Num\tName\tScore:\n");
scanf("%d %s %f",&p_new->num,p_new->name,&p_new->score);
for(i=1;i<n;i++){
pa = pa->next;
}
pb = pa->next;
pa->next = p_new;
p_new->next = pb;
inode++;
}
void output(struct student *ph){
int i;
struct student *pa;
printf("\n*****students list*****\n");
printf("Order\tNum\tName\tScore\n");
pa = ph;
for(i=1;pa!=NULL;i++){
printf("%d\t%d\t%s\t%.2f\n", i,pa->num,pa->name,pa->score);
pa=pa->next;
}
printf("totol %d \n",inode);
}
struct student *input(void){
struct student *pa;
pa = (struct student *)malloc(LEN);
printf("please the new student information\n");
printf("Num\tName\tScore\n");
scanf("%d %s %f", &pa->num, pa->name, &pa->score);
return pa;
}
void clearline(int n){
int space;
printf("\r");
for(space=0;space<n;space++){
printf("-");
}
printf("\r");
}
运行过程及结果:
please input student informations:
Num Name Score
1 aa 10
Press any key input data continue, otherwise press n quit:y
please input student informations: -------------------------
Num Name Score
2 bb 20
Press any key input data continue, otherwise press n quit:y
please input student informations: -------------------------
Num Name Score
3 cc 30
Press any key input data continue, otherwise press n quit:n
*****students list*****
Order Num Name Score
1 1 aa 10.00
2 2 bb 20.00
3 3 cc 30.00
totol 3
which student's num do you want to del?
please input the num that you want to del:2
*****students list*****
Order Num Name Score
1 1 aa 10.00
2 3 cc 30.00
totol 2
which student's num do you want to insert after:1
please input the new student informations:
Num Name Score:
2 bb 20
*****students list*****
Order Num Name Score
1 1 aa 10.00
2 2 bb 20.00
3 3 cc 30.00
totol 3
结束