第十章:结构体与共用体05
让编程改变世界
Change the world by program
对链表结点的删除操作实现
实现源代码: [codesyntax lang="c"]#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define LEN sizeof(struct student) // student结构的大小 struct student *creat(); // 创建链表 struct student *del( struct student *head, int num); // del函数用于删除结点, *head即链表 // 的头指针, num是要删除的结点num。 void print(struct student *head); // 打印链表 struct student { int num; float score; struct student *next; }; int n; // 全局变量,用来记录存放了多少数据。 void main() { struct student *stu, *p; int n; stu = creat(); p = stu; print( p ); printf("Please enter the num to delete: "); scanf("%d", &n); print( del(p, n) ); printf("nn"); system("pause"); } struct student *creat() { struct student *head; struct student *p1, *p2; p1 = p2 = (struct student *)malloc(LEN); // LEN是student结构的大小 printf("Please enter the num :"); scanf("%d", &p1->num); printf("Please enter the score :"); scanf("%f", &p1->score); head = NULL; n = 0; while( p1->num ) { n++; if( 1 == n ) { head = p1; } else { p2->next = p1; } p2 = p1; p1 = (struct student *)malloc(LEN); printf("nPlease enter the num :"); scanf("%d", &p1->num); printf("Please enter the score :"); scanf("%f", &p1->score); } p2->next = NULL; return head; } void print(struct student *head) { struct student *p; printf("nThere are %d records!nn", n); p = head; if( head ) { do { printf("学号为 %d 的成绩是: %fn", p->num, p->score); p = p->next; }while( p ); } } struct student *del( struct student *head, int num) { struct student *p1, *p2; if( NULL == head ) // 如果头结点指向NULL,这是一个空链表。纯属忽悠T_T { printf("nThis list is null!n"); goto END; } p1 = head; while( p1->num != num && p1->next != NULL) { p2 = p1; p1 = p1->next; } if( num == p1->num ) { if( p1 == head ) // 当将要删除的结点位于头结点的时候 { head = p1->next; } else // 一般情况 { p2->next = p1->next; } printf("nDelete No: %d succeed!n", num); n = n-1; // n是作为一个全局变量,用来记录链表的数据数。 } else { printf("%d not been found!n", num); } END: return head; }[/codesyntax]