| 
                         /* 
=========================== 
 功能:输出节点 
 返回: void 
=========================== 
*/ 
void Print(struct student *head) 
{ 
    struct student *p; 
    printf ("nNow,These %d records are:n",n); 
    p = head; 
    if(head != NULL)        //只要不是空链表,就输出链表中所有节点 
    { 
        printf("head is %on",head);     //输出头指针指向的地址 
        do 
        { 
            /* 
            输出相应的值:当前节点地址、各字段值、当前节点的下一节点地址。 
            这样输出便于读者形象看到一个单向链表在计算机中的存储结构,和我们 
            设计的图示是一模一样的。 
            */ 
            printf ("%o   %d   %5.1f   %on",p,p->num,p->score,p->next); 
            p = p->next;        //移到下一个节点 
        } 
        while (p != NULL); 
    } 
}/* 
=========================== 
 功能:输出节点 
 返回: void 
=========================== 
*/ 
void Print(struct student *head) 
{ 
    struct student *p; 
    printf ("nNow,p->next); 
            p = p->next;        //移到下一个节点 
        } 
        while (p != NULL); 
    } 
} 
单向链表的删除图示: 
    ---->[NULL] 
    head 
    图3:空链表 
   从图3可知,空链表显然不能删除 
   ---->[1]---->[2]...---->[n]---->[NULL](原链表) 
   head   1->next  2->next   n->next 
   ---->[2]...---->[n]---->[NULL](删除后链表) 
   head   2->next   n->next 
   图4:有N个节点的链表,删除第一个节点 
   结合原链表和删除后的链表,就很容易写出相应的代码。操作方法如下: 
   1、你要明白head就是第1个节点,head->next就是第2个节点; 
    2、删除后head指向第2个节点,就是让head=head->next,OK这样就行了。 
    ---->[1]---->[2]---->[3]...---->[n]---->[NULL](原链表) 
    head   1->next  2->next  3->next   n->next 
    ---->[1]---->[3]...---->[n]---->[NULL](删除后链表) 
   head   1->next  3->next   n->next 
   图5:有N个节点的链表,删除中间一个(这里图示删除第2个) 
   结合原链表和删除后的链表,就很容易写出相应的代码。操作方法如下: 
   1、你要明白head就是第1个节点,1->next就是第2个节点,2->next就是第3个节点; 
   2、删除后2,1指向第3个节点,就是让1->next=2->next。 
   删除指定学号的节点的函数为: 
/* 
========================== 
 功能:删除指定节点 
  (此例中是删除指定学号的节点) 
 返回:指向链表表头的指针 
========================== 
*/ 
struct student *Del (struct student *head,int num) 
{ 
    struct student *p1;        //p1保存当前需要检查的节点的地址 
    struct student *p2;        //p2保存当前检查过的节点的地址 
    if (head == NULL)        //是空链表(结合图3理解) 
    { 
        printf ("nList is null!n"); 
        return head; 
    } 
    //定位要删除的节点 
    p1 = head; 
    while (p1->num != num && p1->next != NULL)    //p1指向的节点不是所要查找的,并且它不是最后一个节点,就继续往下找 
    { 
        p2 = p1;            //保存当前节点的地址 
        p1 = p1->next;        //后移一个节点 
    }                         (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |