表尾添加法

例:用表尾添加法编写函数建立一个链表,存放若干名学生的数据,直到输入的学号是“0”为止。

#include "stdio.h"

#include "stdlib.h"

struct stu_node        // 定义结构体类型

 {    int  num ; 

      float score ;

      struct stu_node*next ;

 };

#define  LEN  sizeof(struct stu_node)     //求出结构体类型占用的字节数

一、建表

struct stu_node *creat( void )       //函数返回值为链表的头指针

{  struct stu_node *p1, *p2, *head=NULL;       

    p1=p2=(struct stu_node *) malloc(LEN); //令p1、p2指向新结点

   scanf("%d%f",&p1->num,&p1->score);   //输入新结点数据成员

   while ( p1->num !=0 )      //判断新结点的学号是否为0

   {    if ( head==NULL )     //若头指针为空,则令头指针指向表头结点

                head = p1;

          else                          

               p2->next = p1;   //否则令当前表尾结点指针成员指向新结点

          p2 = p1;                    //p2指向新的表尾结点

          p1= ( struct stu_node *) malloc (LEN);     //p1指向新结点

          scanf("%d%f",&p1->num,&p1->score) ;

    }

   p2->next= NULL;         //表尾结点的指针成员赋空值

   free(p1);                         //释放p1指向的结点空间 

   return(head);                //返回头指针

}

二、输出链表

编写函数输出链表中所有结点的数据成员的值

void list(struct stu_node *head)​

{   struct stu_node *p;

    if (head==NULL)  printf(“链表为空!\n”); 

    else

         {   printf(“链表信息如下:\n”);

               p=head;                //p赋值为head,即p指向表头结点

               while(p!=NULL)

                  {    printf("%d, %5.2f\n", p->num,p->score);

                        p=p->next;          //令p指向下一个结点

                   }

          }

}

三​、链表结点的删除操作

编写函数删除链表中的结点。

struct stu_node *del (struct stu_node*head, int num)

{  struct stu_node *p1 , *p2=NULL ;

   if (head==NULL)  printf("链表为空不能进行删除操作!\n");   

   else  

       {  p1 = head;                       //p1指向表头结点

           while((num!=p1->num)&& (p1->next!=NULL))  

           {   p2 = p1;                      //p2指向p1所指向的结点

                p1= p1->next ;          //p1指向下一个结点

            }

           if ( num == p1->num )    //判断p1是否指向要删除的结点

           {    if (p1==head)  head = p1->next;   //删除表头结点

                else   p2->next = p1->next;        //删除中间或表尾结点

                free(p1);                                   //释放已删除的结点空间

                printf("结点已删除! \n");    

            }

           else   printf("链表中不存在该结点, 不能删除!\n");      

       }

    return  head;

}

通过使用循环, 可以不断删除结点, 直到用户输入字符’n’为止​

int main(void)

{  struct stu_node *head;    intdelnum;

   char ch=’y’;

   head=creat();        list(head);

   printf(“进行删除结点操作\n”);

   while(ch==’y’||ch==’Y’)

   {   printf(“输入要删除学生的学号:”);

        scanf(“%d”,&delnum);    getchar( ); 

        head=del (head, delnum);

        printf(“继续删除其他学生的信息吗?(y/n):”);

        ch=getchar( );                       //读取字符’y’或字符’n’

        getchar( );                          //空读,读取回车符

    } 

   printf(“删除后的学生信息:\n”);

   list(head);

   return 0;

}


四、​链表结点的插入操作

编写函数实现向有序链表中插入一个结点

struct stu_node *insert ( struct stu_node *head )

{  struct stu_node *p0 , *p1 , *p2 ; 

    p0=( struct stu_node *) malloc (LEN);    //p0指向产生的新结点

    p0->next = NULL;                    //p0指针成员赋NULL

    printf("输入学号和成绩:");

    scanf("%d%f",&p0->num,&p0->score);  //输入数据成员

    getchar( );                            //空读,读取回车符

    if (head==NULL)  head = p0;   //链表为空时,令head指向新结点

    else                          //链表不为空时,执行以下插入操作

        {   p1 = head;                   //p1 指向表头结点

            while ((p0->num>p1->num)&& (p1->next!=NULL)) 

            {     p2 = p1;       p1 = p1->next;      }

            if ( p0->num<= p1->num )    

            {    if ( head==p1)  head = p0;  //插入表头结点

                  else    p2->next = p0;    //插入中间结点

                  p0->next= p1;           // p0的指针成员指向p1

            }

            else   p1->next = p0;          //插入表尾结点

         }  

       return( head );

 }


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值