链表的增删改查的操作

来源:互联网 发布:java ee开发方向 编辑:程序博客网 时间:2024/06/04 19:06


#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
structstudent{
    intnum;
    doublescore;
    structstudent *next;
};
 
//创建一个链表
structstudent * create(void){
    structstudent *p1,*p2,*head;
    intn = 0;
    p1 = p2 = (structstudent *)malloc(LEN);
    scanf("%d%lf",&(p1->num),&(p1->score));
    while(p1->num!=0){
        n++;
        if(n==1){
            head = p1;
        }else{
            p2 = p1;
        }
        p1 = (structstudent *)malloc(LEN);
        scanf("%d%lf",&(p1->num),&(p1->score));
        p2->next = p1;
    }
     
    p2->next = NULL;
    returnhead;
}
structstudent *delw(structstudent *start,intnum){
    structstudent *p1,*p2;
    //链表为空
    if(start==NULL){
        printf("\nlist null!\n");
        returnNULL;
    }
    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){
            returnstart->next;
        }else{
            p2->next = p1->next;
        }
    }else{
        printf("number not found!");
    }
     
    returnstart;
}
 
structstudent *del(structstudent *head,longnum){
 
    structstudent *p1, *p2;
    //链表为空
    if(head == NULL){
        printf("\nlist null!\n");
        returnhead;
    }
    //链表不为空
    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);
    returnhead;
 
}
//删除一个节点
structstudent * deleteNode(structstudent *start,intnum){
    structstudent *p1, *p2,*before,*after;
    //空表
    if(start==NULL){
        printf("the linktable is null");
        returnNULL;
    }
    p1 = p2 = start;
    //只有一个节点
    if(start->next==NULL){
        if(start->num==num){
            returnNULL;
        }
    }
    //链表不为空(两个以上的节点)
    //1:链表的第一个即为所要找的
    if((start->num == num)&&(start->next!=NULL)){
        returnstart->next;
    }
    while(p1!=NULL){
        if(p1->num==num){
            before = p2;
            after = p1->next;
        }
        p2 = p1;
        p1 = p1->next;
    }
    before->next = after;
    returnstart;
}
 
structstudent * insert(structstudent *head,structstudent *stu){
    structstudent *p1,*p2, *p0;
    p1 = head;
    p0 = stu;
     
    //链表为空
    if(head == NULL){
        head = p0;
        p0->next = NULL;
        printf("the link is null\n");
        returnNULL;
        //链表不为空,比较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;
        }
 
        returnhead;
    }
     
 
}
 
voidprintLink(structstudent *p){
    structstudent *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; 
    }
}
intmain(void){
     
    structstudent * p_std, * p_afterDel,*p,*p_afterInsert;
    structstudent 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 0
原创粉丝点击