c: 链表的增删改查的操作

点击打开链接

#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"); 
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值