链表的增删改查的操作


#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student{
    int num;
    double score;
    struct student *next;
};
 
//创建一个链表
struct student * create(void){
    struct student *p1,*p2,*head;
    int n = 0;
    p1 = p2 = (struct student *)malloc(LEN);
    scanf("%d%lf",&(p1->num),&(p1->score));
    while(p1->num!=0){
        n++;
        if(n==1){
            head = p1;
        }else{
            p2 = p1;
        }
        p1 = (struct student *)malloc(LEN);
        scanf("%d%lf",&(p1->num),&(p1->score));
        p2->next = p1;
    }
     
    p2->next = NULL;
    return head;
}
struct student *delw(struct student *start,int num){
    struct student *p1,*p2;
    //链表为空
    if(start==NULL){
        printf("\nlist null!\n");
        return NULL;
    }
    p1 = start;
    p2 = NULL;
    //链表不为空
    //链表只有一个元素,且即为所要找的元素
    /*if(p1->next==NULL&&p1->num == num){
        printf("there is only one element and that is it!");
        return NULL;
    }*/
    while(p1->next!=NULL&&p1->num!=num){
        p2 = p1;
        p1 = p1->next;
    }
     
    if(num == p1->num){
        if(p1 == start){
            return start->next;
        }else{
            p2->next = p1->next;
        }
    }else{
        printf("number not found!");
    }
     
    return start;
}
 
struct student *del(struct student *head,long num){
 
    struct student *p1, *p2;
    //链表为空
    if(head == NULL){
        printf("\nlist null!\n");
        return head;
    }
    //链表不为空
    p1 = head;
    while(p1->next!=NULL&&num!=p1->num){
        p2 = p1;
        p1 = p1->next;
    }
    if(num == p1->num){
        if(p1 == head){
            head = p1->next;
        }else{
            p2->next = p1->next;
            printf("delete:%ld\n",num);
        }
    }else
            printf("%ld not been found!\n",num);
    return head;
 
}
//删除一个节点
struct student * deleteNode(struct student *start,int num){
    struct student *p1, *p2,*before,*after;
    //空表
    if(start==NULL){
        printf("the linktable is null");
        return NULL;
    }
    p1 = p2 = start;
    //只有一个节点
    if(start->next==NULL){
        if(start->num==num){
            return NULL;
        }
    }
    //链表不为空(两个以上的节点)
    //1:链表的第一个即为所要找的
    if((start->num == num)&&(start->next!=NULL)){
        return start->next;
    }
    while(p1!=NULL){
        if(p1->num==num){
            before = p2;
            after = p1->next;
        }
        p2 = p1;
        p1 = p1->next;
    }
    before->next = after;
    return start;
}
 
struct student * insert(struct student *head,struct student *stu){
    struct student *p1,*p2, *p0;
    p1 = head;
    p0 = stu;
     
    //链表为空
    if(head == NULL){
        head = p0;
        p0->next = NULL;
        printf("the link is null\n");
        return NULL;
        //链表不为空,比较num,(如22, 33, 55),44应插入至33后面
    }else{
        //一个元素
        //printf("head.next is not null");
        //两个以上元素: 22 55 88
        while(p1->num<p0->num&&p1->next!=NULL){
            p2 = p1;
            p1 = p1->next;
        }
 
        if(p1->num>p0->num){//
            if(p1==head){//p0排到最前
                head = p0;
                p0->next = p1;
            }else{
                //p0排到中间
                p2->next = p0;
                p0->next = p1;
            }
        }else{//p0排到最后
            p1->next = p0;
            p0->next = NULL;
        }
 
        return head;
    }
     
 
}
 
void printLink(struct student *p){
    struct student *p_afterDeal = p;
    p_afterDeal = p;
    while(p_afterDeal!=NULL){
        printf("num = %d, score = %lf\n",p_afterDeal->num,p_afterDeal->score);
        p_afterDeal = p_afterDeal->next; 
    }
}
int main(void){
     
    struct student * p_std, * p_afterDel,*p,*p_afterInsert;
    struct student newstd = {44,44.4,NULL};
    //创建一个链表
    printf("创建一个链表:\n");
    p_std = create();
    printf("创建的链表如下:\n");
    printLink(p_std);
    //插入一个节点
    printf("插入一个节点:44\n");
    p = &newstd;
    p_afterInsert = insert(p_std,p);
    printf("插入一个节点后的列表如下:\n");
    printLink(p_afterInsert);
    //删除一个节点
    printf("删除一个节点:44\n");
    p_afterDel = deleteNode(p_afterInsert,44);
    printf("删除一个节点后的列表如下:\n");
    printLink(p_afterDel);
    system("pause");
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值