该代码是基于网上其他代码修改而来,原来的代码有错误,以下是我修改后并在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 Score1 aa 10Press any key input data continue, otherwise press n quit:yplease input student informations: -------------------------Num Name Score2 bb 20Press any key input data continue, otherwise press n quit:yplease input student informations: -------------------------Num Name Score3 cc 30Press any key input data continue, otherwise press n quit:n*****students list*****Order Num Name Score1 1 aa 10.002 2 bb 20.003 3 cc 30.00totol 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 Score1 1 aa 10.002 3 cc 30.00totol 2 which student's num do you want to insert after:1please input the new student informations:Num Name Score:2 bb 20*****students list*****Order Num Name Score1 1 aa 10.002 2 bb 20.003 3 cc 30.00totol 3结束
新闻热点
疑难解答