zhaoqingdz 发表于 2022-8-7 21:58

初学C语言之初级链表的实现

不多说了,直接上代码:

#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(struct student)

struct student
{
        long num;
        float score;
        struct student *next;
};

int n;

int main()
{
        struct student* creat();
        struct student*del(struct student *, long);
        struct student*insert(struct student*, struct student*);
        void print(struct student*);
        struct student*head, *stu;
        long del_num;
        printf("input records:\n");
        head = creat();
        print(head);
        printf("\ninput the deleted number:");
        scanf("%ld", &del_num);
        while (del_num != 0)
        {
                head = del(head, del_num);
                print(head);
                printf("input the deleted number:");
          scanf("%ld", &del_num);
        }
        printf("\ninput the inserted record:");
        stu = (struct student*)malloc(LEN);
        scanf("%ld,%f", &stu->num, &stu->score);
        while (stu->num != 0)
        {
                head = insert(head, stu);
                print(head);
                printf("input the inserted record:");
                stu = (struct student*)malloc(LEN);
                scanf("%ld,%f", &stu->num, &stu->score);
        }
        return 0;
}

//定义建立链表的creat函数
struct student*creat()
{
        struct student*head;
        struct student*p1, *p2;
        n = 0;
        p1 = p2 = (struct student*)malloc(LEN);
        scanf("%ld,%f", &p1->num, &p1->score);
        head = NULL;
        while (p1->num != 0)
        {
                n = n + 1;
                if (n == 1)
                        head = p1;
                else
                        p2->next = p1;
                p2 = p1;
                p1 = (struct student*)malloc(LEN);
                scanf("%ld,%f", &p1->num, &p1->score);
        }
        p2->next = NULL;
        return(head);
}

//定义删除结点的del函数
struct student*del(struct student*head, long num)
{
        struct student*p1, *p2;
        if (head == NULL)
        {
                printf("\nlist null! \n");
                return (head);
        }
        p1 = head;
        while (num != p1->num&&p1->next != NULL)
        {
                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);
                n = n - 1;
        }
        else
                printf("%ld not been found!\n", num);
        return(head);
}

//定义插入结点的insert的函数
struct student*insert(struct student*head, struct student*stud)
{
        struct student*p0, *p1, *p2;
        p1 = head;
        p0 = stud;
        if (head == NULL)
        {
                head = p0;
                p0->next = NULL;
        }
        else
        {
                while ((p0->num > p1->num) && (p1->next != NULL))
                {
                        p2 = p1;
                        p1 = p1->next;
                }
                if (p0->num <= p1->num)
                {
                        if (head == p1)
                                head = p0;
                        else
                                p2->next = p0;
                        p0->next = p1;
                }
                else
                {
                        p1->next = p0;
                        p0->next = NULL;
                }
        }
        n = n + 1;
        return (head);
}

//定义输出链表的print函数
void print(struct student*head)
{
        struct student*p;
        printf("\nNow,These %d records are:\n", n);
        p = head;
        if (head!=NULL)
        do
        {
                printf("%ld %5.1f\n", p->num, p->score);
                p = p->next;
        } while (p != NULL);
}

luoye1997 发表于 2022-8-8 11:31

感谢大佬啊
页: [1]
查看完整版本: 初学C语言之初级链表的实现