链表的创建、插入、删除、释入

来源:互联网 发布:淘宝开店一定要交保证金吗 编辑:程序博客网 时间:2024/06/06 11:18
#include<stdio.h>
#include<stdlib.h>

struct chain
{
    int num;
    float score;
    struct chain *next;
};

//创建新链表
struct chain *create()
{
    struct chain *head;
    //申请新节点空间
    head = (struct chain *)malloc(sizeof(struct chain));
    if(head == NULL)
    {
        printf("申请节点失败\n");
        return NULL;
    }
    return head;
}

//加入新的节点
struct chain *insert(struct chain *head,struct chain *s)
{
    struct chain *p=head;
    //如果链表循环并且新节点的分数大于下一个节点的分数
    while((p->next != NULL) && (s->score > p->next->score))
    {
        p=p->next;
    }
    //如果链表循环到结尾
    if(p->next == NULL)
    {
        p->next = s;
        s->next = NULL;
    }
    //如果新的节点的分数大于下一个节点的分数
    else
    {
        p->next = s;
        s->next = p->next;
    }
    return head;
}

//查找符号条件的节点
struct chain *search(struct chain *head)
{
    int num;
    struct chain *p = head;
    printf("请输入要查找的学生的学号:\n");
    scanf("%d",&num);

    //链表循环并且链表中的学号不等于要查找的学号
    while((p->next != NULL) && (p->num != num))
    {
        p=p->next;
    }

    //链表循环到结尾
    if(p->next == NULL)
    {
        printf("查找学号失败,没有这个学号\n");
        return NULL;
    }
    //链表中的学号等于要查找的学号
    else
    {
        printf("找到符号条件的学号num=%d\t%f",p->num,p->score);
        return p;
    }
}

//对链表进遍历输出
void printf_list(struct chain *head)
{
    struct chain *p = head;
    printf("链表如下:\n");

    while(p->next != NULL)
    {
        printf("学生的学号%d,成绩%f",p->num,p->score);
        p=p->next;
    }
}

//释放链表
void free_list(struct chain *head)
{
    struct chain *p = head;

    while(p->next != NULL)
    {
        head = head->next;
        free(p);
        p=head;
    }
    printf("释入链表成功\n");
}

//删除链表符合条件的节点
struct chain *delete_list(struct chain *head,int num)
{
    struct chain *p = head;
    struct chain *q = head->next;

    while((q != NULL) && (q->num != num))
    {
        p=q;
        q=q->next;
    }

    if(q == NULL)
    {
        printf("删除失败,没有找到符合条件的节点\n");
        return NULL;
    }
    else
    {
        p->next = q->next;
        free(q);
        printf("删除节点成功\n");
    }
    return head;
}

int main()
{
    struct chain *p,*head;
    int num;
    int c;
    float score;
    printf("有头节点的链表操作程序:\n");
    head = create();
    
    while(1)
    {
        printf("I:插入节点(自动升序) P:输出链表 S:查找节点 D:删除节点\
               E:释入链表并退出程序\n");
        c = getchar();
        switch(c)
        {
            case'I':
            printf("请分别输入要插入学生的学号和成绩\n");
            scanf("%d%f",&num,&score);
            p = (struct chain *)malloc(sizeof(struct chain));
            if(p == NULL)
            {
                printf("申请节点失败\n");
                exit(0);
            }
            p->num = num;
            p->score = score;
            insert(head,p);
            printf("插入成功\n");
            break;
            case'P':
            printf_list(head);
            break;
            case'S':
            search(head);
            break;
            case'D':
            printf("请输入要删除学生的学生号:\n");
            scanf("%d",&num);
            delete_list(head,num);
            break;
            case'E':
            free_list(head);
            exit(0);
        }
    }
    return 0;
}