/* * 这个程序是用链式线性表实现表中元素的删除、增添、查找、输出、求和。 * 其中增添函数中用到查找函数。 */ #include<stdio.h> #include<stdlib.h> #define LEN sizeof(student) typedef struct student{ /*学生信息*/ long num; double score; struct student *next; }student; student *create(){ /*插入学生信息,构建链表*/ student *head,*p1,*p2; int n; p1 = p2 = (student*)malloc(LEN); head = NULL; n = 1; while(n<=10){ scanf("%d%lf",&p1->num,&p1->score); if(n==1) head = p1; else p2->next = p1; p2 = p1; p1 = (student*)malloc(LEN); n++; } p2->next = NULL; return head; } student *delete1(student *head,long num){ /*删除链表中的元素*/ student *p,*pre; p = head; if(head->num==num){ pre = head; head = pre->next; }else pre = head; p = head->next; while(p!=NULL){ if(p->num==num) break; else{ pre = p; p = p->next; } } pre->next = pre->next->next; return head; } student *search(student *head,long num){ /*查找链表中元素*/ int i; /*并返回元素的位置*/ student *p; p = head; for(i=1;;i++){ if(p==NULL||p->num==num){ break; } p = p->next; } return p; } student* add(student* head,long num){ /*将新元素添加到链表的指定位置*/ student *p,*s; long num2; double score2; s=(student *)malloc(LEN); p=search(head,num); if(p!=NULL){ scanf("%ld%lf",&num2,&score2); s->num = num2; s->score = score2; s->next = p->next; p->next = s; } return head; } double sum(student *head){ /*将链表中元素的指定成员的值加和*/ int i; double sum1; student *p; p = head; sum1 = 0; for(i = 1;;i++){ if(p==NULL) break; sum1 = sum1+p->score; p = p->next; } return sum1; } void print(student *head){ /*打印链表*/ int i; student *p; p = head; printf("\n"); for(i = 1;;i++){ if(p==NULL) break; printf("%4ld %.1lf\n",p->num,p->score); p = p->next; } } int main(){ long num1,num2; double sum1; student *t,*g,*k; t = create(); scanf("%ld",&num1); g = delete1(t,num1); scanf("%ld",&num2); k = add(g,num2); print(k); sum1 = sum(k); printf("\n%7.1lf\n",sum1); return 0; } /* * 测试案例: * * 输入: * 1 10 * 2 20 * 3 30 * 4 40 * 5 50 * 6 60 * 7 70 * 8 80 * 9 90 * 10 100 * * 0004 //要删除的元素的 num * 0005 //新元素插入在 num 为这一数值的元素后 * 0011 110 //新元素的信息 * * 输出: * 1 10.0 * 2 20.0 * 3 30.0 * 5 50.0 * 11 110.0 * 6 60.0 * 7 70.0 * 8 80.0 * 9 90.0 * 10 100.0 * * 620.0 */