数据结构学习笔记-链表

线性表的链式存储结构

以下为用到的头文件

#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
链式存储结构
typedef struct LNobe
{
    int data;//数据域
    struct LNobe* pNext;//指针域
}LNobe,*PNobe;//LNobe等价于struct LNobe ,PNobe等价于struct LNobe *
链表的初始化

我们这里在初始化时创建了一个带有头结点空表

void InitList(PNobe& pL)//链表初始化
{
    pL = (PNobe)malloc(sizeof(LNobe));//生成新的结点,用头指针指向它
    if (NULL == pL)
    {
        printf("内存分配失败\n");
        exit(-1);
    }
    pL->pNext = NULL;//头结点指向空
    return;
}
创建一个单链表(头插法)

(此方法创建的单链表遍历输出时与输入的顺序是反着的)

void CreateList_H(PNobe& pL, int n)
{
    int i = 0, temp = 0;
    PNobe H = NULL;
    for (i = 0; i < n; i++)
    {
        printf("请输入第%d个数据:", i + 1);
        scanf("%d", &temp);
        H = (PNobe)malloc(sizeof(LNobe));//生成新结点
        if (NULL == H)
        {
            printf("内存分配失败\n");
            exit(-1);
        }
        H->data = temp;
        H->pNext = pL->pNext;//让新结点的下一个指向头结点的下一个
        pL->pNext = H;//再将头结点的下一个指向新结点
    }
}
创建一个单链表(尾插法)
void CreateList_R(PNobe& pL, int n)//用后插法创建单链表,n表示要创建的有效结点个数
{
    PNobe R = pL;//创建一个尾指针,使它与头指针一同指向头结点
    PNobe P = NULL;//用于生成新的结点
    int i = 0, temp = 0;//temp用来存放输入数据;
    for (i = 0; i < n; i++)
    {
        P = (PNobe)malloc(sizeof(LNobe));//生成新结点
        if (NULL == P)
        {
            printf("内存分配失败\n");
            exit(-1);
        }
        printf("请输入第%d个数据:", i + 1);
        scanf("%d", &temp);
        P->data = temp;
        P->pNext = NULL;//新节点指针域指向空;
        R->pNext = P;//让头结点指针域指向新节点;
        R = P;//让尾指针指向新结点
    }
}
单链表的遍历
void TraverseList(PNobe pL)//遍历函数访问每一个节点
{
    PNobe P = pL->pNext;
    printf("结果:\n");
    while (NULL != P)
    {
        printf("%d ", P->data);
        P = P->pNext;
    }
    printf("\n");
}
查找函数
PNobe LocateElem(PNobe& pL, int e)//查找与e值相等的元素
{
    PNobe P = pL->pNext;
    while (P && P->data != e)
    {
        P = P->pNext;
    }
    return P;//查找失败返回NULL
}
取值函数
bool GetElem(PNobe pL, int n, int& e)//取值函数n为所取元素的序号,e用于接收元素
{
    PNobe P = pL->pNext;//让P指向首元结点也就是第一个有效数据
    int i = 1;//用于计数
    while (P && i < n)
    {
        P = P->pNext;
        i++;
    }
    if (P == NULL || i > n)
        return false;
    e = P->data;
    return true;
}
插入函数
bool InsertList(PNobe& pL, int n, int elem)//插入函数,n为插入位置,elem为插入的数据
{
    PNobe P = pL;
    int i = 0;
    while (P && i <n-1)//找到插入元素的前一个结点
    {
        P = P->pNext;
        i++;
    }
    if (P == NULL || i > n - 1)
    {
        printf("InsertList false\n");
        exit(-1);
    }
    PNobe T = (PNobe)malloc(sizeof(LNobe));
    if (NULL == T)
    {
        return false;
    }
    T->data = elem;
    T->pNext = P->pNext;
    P->pNext = T;
    return true;
}

删除函数

int DeleteElem(PNobe& pL, int n)
{
    PNobe P = pL, R;
    int i = 0;
    while (P  && i < n - 1)
    {
        P = P->pNext;
        i++;
    }
    if (P == NULL || i > n - 1)
        exit(-1);
    R = P->pNext;
    P->pNext = R->pNext;
    i = R->data;
    free(R);
    return i;
}
计算单链表有效长度
int Length_list(PNobe pL)
{
    int len = 0;
    PNobe P = pL;
    while (P->pNext != NULL)
    {
        P = P->pNext;
        len++;
    }
    return len;
}
对单链表进行排序

与冒泡排序类似

void Sort_List(PNobe pL)//排序函数,将链表中元素按递增顺序排列,len表示链表中有效结点个数
{
    int i, j, t = 0;
    PNobe P, R;
    for (i = 0, P = pL->pNext; i < Length_list(pL)-1 /* && P->pNext != NULL*/; i++, P = P->pNext)//与数组排序相似
    {
        for (j = i+1, R = P->pNext; j < Length_list(pL)  /* && R->pNext != NULL*/; j++, R = R->pNext)
        {
            if (P->data > R->data)
            {
                t = P->data;
                P->data = R->data;
                R->data = t;
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值