单链表的一些基本操作 排序 查找 删除 等等

本文深入讲解了链表的基本操作,包括创建、初始化、显示、销毁、清空、获取元素、插入、删除、排序等,提供了详细的C语言实现代码,适合初学者理解和掌握链表的数据结构。

 

#include<stdafx.h>
#include<stdlib.h>
#define length sizeof(struct node)

typedef struct node
{
    int data;
    struct node *next;
} Test;

Test *head, *p, *q, *r;//定义遍历指针

//带有头结点的链表
Test *Create()//这是一个具有头结点的链表
{
    int List_Size;
    head = (Test *)malloc(length);    //首先创建一个头结点
    p = head;    //用遍历指针先指向头结点
    p->next = (Test *)malloc(length);    
    p = p->next;
    printf("请输入链表的长度:");
    scanf("%d", &List_Size);

    if (List_Size>0)
    {
        for (int i = 1; i<List_Size; i++)
        {
            p->next = (Test *)malloc(length);
            p = p->next;
        }
        p->next = NULL;
        return head;
    }
    else
    {
        printf("链表的长度必须大于0\n");
    }
    return head;
}

void InitList(Test *List_Head)//初始化链表
{
    if (List_Head->next != NULL)
    {
        p = List_Head->next;
        while (p != NULL)
        {
            printf("请输入数据:");
            scanf("%d", &p->data);
            p = p->next;
        }
    }
    else
    {
        printf("链表为空,无法初始化\n");
    }
}

void Display(Test *List_Head)
{
    if (List_Head->next != NULL)
    {

        p = List_Head->next;
        while (p != NULL)
        {
            printf("%d  ", p->data);
            p = p->next;
        }
        printf("\n");
    }
    else
    {
        printf("链表为空,无法展示\n");
    }

}

void DestroyList(Test *List_Head)
{
    if (List_Head->next != NULL)
    {
        p = List_Head->next;
        q = List_Head->next;

        while (p != NULL)
        {
            p = p->next;
            free(q);
            q = p;
        }
        //List_Head=NULL;
        //free(List_Head);
        printf("销毁成功\n");
    }
    else
    {
        printf("链表为空,无需销毁\n");
    }
}

void ClearList(Test *List_Head)
{
    if (List_Head->next != NULL)
    {
        q = p = List_Head->next;
        while (p != NULL)
        {
            p = p->next;
            free(q);
            q = p;
        }
        List_Head->next = NULL;
        printf("清空成功\n");
    }
    else
    {
        printf("链表为空,无法清空\n");
    }
}

int ListLength(Test *List_Head)
{
    int List_Length = 0;
    if (List_Head->next != NULL)
    {
        p = List_Head->next;
        while (p != NULL)
        {
            List_Length++;
            p = p->next;
        }
    }
    else
    {
        printf("链表为空,长度为0");
    }
    return List_Length;
}

int ListEmpty(Test *List_Head)
{
    if (List_Head->next != NULL)
    {
        return 0;
    }
    else
        return 1;
}

int *GetElem(Test *List_Head, int i, int *e)//i是第几个元素  用e返回该元素的值
{
    if (List_Head->next != NULL)
    {
        p = List_Head->next;
        //if(i<=ListLength(List_Head))
        for (int j = 0; j<i; j++)
        {
            //printf("%d",p->data);
            if (j == i - 1)//意味着指针已经挪动到该位置了
            {
                *e = p->data;//将该元素赋值给e
            }
            p = p->next;
        }
    }
    return e;
}

void ListInsert(Test *List_Head, int i, int e)//i为要插入的位置  e为要插入的元素  该插入是前插  不是后插
{
    if (List_Head->next != NULL)
    {
        if (i <= ListLength(List_Head))//判断插入的位置存在吗
        {
            p = List_Head->next;
            q = List_Head;
            for (int j = 0; j<i; j++)
            {
                if (j == i - 1)
                {
                    r = (Test *)malloc(length);
                    r->data = e;

                    r->next = p;//将r的指针域指向p
                    q->next = r;//将p的指针域指向r  完成前插

                }

                p = p->next;//
                q = q->next;//p q指针分别向后推一个   p q 一前一后
            }
        }
        else
        {
            printf("不存在该结点");
        }
    }
}

int *ListDelete(Test *List_Head, int i, int *e)//i为要删除的位置   用e返回删除的值
{
    if (List_Head->next != NULL)
    {
        p = List_Head->next;
        q = head;
        for (int j = 0; j<i; j++)
        {
            if (j == i - 1)
            {
                *e = p->data;
                q->next = p->next;//将p指向的下一个结点赋给指向p自己的指针
                free(p);
            }
            p = p->next;//
            q = q->next;//同理  p q 一前一后
        }
    }
    return e;
}

void ListSort(Test *List_Head)//排序  由小到大  
{
    if (List_Head->next != NULL)
    {
        q = p = List_Head->next;//指向头结点后的第一个结点
        int temp;
        while (q->next != NULL)
        {
            while (p->next != NULL)
            {
                p = p->next;
                if (q->data > p->data)
                {
                    temp = q->data;
                    q->data = p->data;
                    p->data = temp;
                }
            }//循环一次  最小的被交换到前面
            q = q->next;//指针向后推一个   继续排后面的
            p = q;
        }
    }
    else
    {
        printf("链表为空,无法排序");
    }
}

int main()
{
    Test *List_A, *List_B;
    List_A = Create();
    InitList(List_A);
    //DestroyList(List_A);
    //ClearList(List_A);
    Display(List_A);

    /*
    ListSort(List_A);
    Display(List_A);
    */
    /*
    ListInsert(List_A,2,100);
    Display(List_A);
    */

    /*
    int num,*p=&num;
    printf("\n%d\n",*(ListDelete(List_A,1,p)));
    Display(List_A);
    */

    /*
    int num;
    int *p=&num;
    p=GetElem(List_A,3,p);
    printf("%d",*p);
    */

    /*
    List_B=Create();
    InitList(List_B);
    Display(List_B);
    */
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值