该代码是基于网上其他代码修改而来,原来的代码有错误,以下是我修改后并在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结束
