单链表的操作(二)链表的插入与删除

一、单链表的结点插入

(1)插入的结点位于空链表

(2)插入的结点位于非空链表

  1.     插入的链表位于非空链表的头部
  2.     插入的链表为与非空链表的尾部
  3.     插入的链表位于非空链表的中间部分

创建一个单链表结点的插入函数,将输入的学生的序号作为排序,按照从小到大的学号顺序插入学生信息

struct student *insert(struct student *head,struct student *new)  /*定义插入节点函数 */
{
        struct student *p1,*p2,*pnew;
        p1 = p2 = head;
        pnew = new;
        if(head == NULL){
                head = pnew ;
                pnew->next = NULL;
        }
        else{
                while((pnew->number > p1->number) && (p1->next !=NULL)){
                        p2 = p1;            /*  不断移动指针     */
                        p1 = p1->next;
                }
                if(pnew->number <= p1->number){   /*按照从小到大的学号排序  */
                        if(p1 == head)            /*判断插入位置是否是非空离链表的表头  */
                        { pnew->next = p1; head = pnew; }
                        else   /*插入位置位于链表中间*/
                        {p2->next = pnew;  pnew->next = p1;}
                }else{         /*插入位置位于链表的尾部  */
                        p1->next = pnew;
                        pnew = NULL ;
                }
        }

        return (head);
}

 

二、单链表的结点删除

(1)判断要删除的链表是否为空链表

(2)判断要删除的结点是位于链表的表头、中间还是表尾。

创建一个函数用于删除学生的信息,判断学号位于链表中的哪个位置,然后进行删除

(struct student *)delete(struct student *head,int number)  /* 删除链表结点的函数  */
{
        struct student *p1,*p2;
        p1 = p2 = head;

        if(p1 == NULL){
                printf("the list is empty\n");     /*输入的链表为空链表  */
        }else
        {
                while((number != p1->number) && (p1->next != NULL)){
                        p2 = p1;
                        p1 = p1->next;    /*不断移动指针,判断指向的结点是否为想要的结点   */
                }

                if((number == p1->number)) {
                        if(p1 == head ){
                                head = p1->next;      /* 要删除的结点位于表头  */
                        }else{
                                p2->next = p1->next;   /* 要删除的结点位于中间或者表尾  */
                        }
                }else{
                        printf("Don't have find the number\n");  /*没有找到要删除的结点  */
                }
        }
        return (head);
}
  

综合实例:完成学生信息的写入,删除,排序,显示

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


/*定义链表结构内容*/
struct student
{
        char name[10];
        long int number;
        struct student *next;
};

void putout(struct student *head);/*輸出链表中的内容*/
struct student *delete(struct student *head);  /* 删除链表结点的函数  */
struct student *insert(struct student *head);  /*定义插入节点函数 */
int get_line(char *cmd);


int main()
{
        struct student *head;
        char buf[20];
        head = NULL;

        system("clear");
        while(1){
//              system("clear");        
                printf("\n========================================\n\t\t学生信息功能表\n");
                printf("   [1]查看学生信息\n");
                printf("   [2]输入学生信息\n");
                printf("   [3]删除学生信息\n");
                printf("========================================\n\n");

                printf("请输入命令:");
                fflush(stdout);
                scanf("%s",buf) ;
//              get_line(buf);
                switch(buf[0]){
                        case '1' :
                                putout(head);break;
                        case '2' :
                                head = insert(head);break;
                        case '3' :
                                head = delete(head);break;
                        default  :
                                printf("输入错误\n");break;
                }
        }
        return 0;

}


int get_line(char *cmd)
{
    int i=0;
    char temp;
    memset(cmd,0,sizeof(cmd));

    while (1) {
        temp = getchar();
        cmd[i]=temp;
            if(cmd[i]==13 || cmd[i] == 10){
                        cmd[i]=0;
                        break;
        }
        fflush(stdout);
        i++;
    }
    return 0;
}

struct student *insert(struct student *head)  /*定义插入节点函数 */
{
        struct student *p1,*p2,*pnew;
        p1 = p2 = head;

        pnew = (struct student *)malloc(sizeof(struct student ));
        printf("请输入学生打姓名、学号,输入学号0则结束\n");
        scanf("%s%ld",pnew->name,&pnew->number);
        while(pnew->number >0){
                if(head == NULL){
                        head = pnew ;
                        pnew->next = NULL;
                }
                else{
                        while((pnew->number > p1->number) && (p1->next !=NULL)){
                                p2 = p1;            /*  不断移动指针     */
                                p1 = p1->next;
                        }

                        if(pnew->number <= p1->number){   /*按照从小到大的学号排序  */
                                if(p1 == head)            /*判断插入位置是否是非空离链表的表头  */
                                    { pnew->next = p1; head = pnew; }
                                else   /*插入位置位于链表中间*/
                                    { p2->next = pnew;  pnew->next = p1;}
                        }else{         /*插入位置位于链表的尾部  */
                                p1->next = pnew;
                                pnew = NULL ;
                        }
                }

                pnew = (struct student *)malloc(sizeof(struct student ));
                printf("请输入学生打姓名、学号,输入学号0则结束\n");
                scanf("%s%ld",pnew->name,&pnew->number);
                p2 = p1 = head;

        }
        free(pnew);
        return (head);
}

struct student *delete(struct student *head)  /* 删除链表结点的函数  */
{
        struct student *p1,*p2;
        int number;
        p1 = p2 = head;
        printf("please input the student nember\n");
        scanf("%d",&number);

        if(p1 == NULL){
                printf("the list is empty\n");     /*输入的链表为空链表  */
        }else
        {
                while((number != p1->number) && (p1->next != NULL)){
                        p2 = p1;
                        p1 = p1->next;    /*不断移动指针,判断指向的结点是否为想要的结点   */
                }

                if((number == p1->number)) {
                        if(p1 == head ){
                                head = p1->next;      /* 要删除的结点位于表头  */
                        }else{
                                p2->next = p1->next;   /* 要删除的结点位于中间或者表尾  */
                        }
                }else{
                        printf("Don't have find the number\n");  /*没有找到要删除的结点  */
                }
        }

        return (head);
}

/*輸出链表中的内容*/
void putout(struct student *head)
{
        if(head == NULL) printf("暂无学生信息\n");
        while(head!=NULL)
        {
                printf("name:%s\t number:%ld\n",head->name,head->number);
                head = head->next;
        }

}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值