C语言顺序表

推荐使用环境:
表长度不大
不做(少做)插入/删除
只在表的端点插入/删除

添加

for (int i = 数组长度-1; i >=插入位置; i--)
{
    数组[i + 1] = 数组[i];
}
数组[位置] = 数据;

删除

for (int i = 删除位置; inRight)
    {
        return -1;
    }
    // 判断是否与结果相同
    if (nFindData==nArray[nMid])
    { // 返回下表
        return nMid;
    }
    // 当前值比查找的要小
    if (nArray[nMid]nRight)
    {
        return -1;
    }
    // 判断是否与结果相同
    if (nFindData==nArray[nMid])
    { // 返回下表
        return nMid;
    }
    // 当前值比查找的要小

C语言带头单链表和不带头单链表

带头单链表

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 

typedef struct _ListNode
{
    _ListNode* pNext;
    int nData;
}ListNode, *PListNode;

typedef struct _ListHead
{
    PListNode pNext;
}ListHead, *PListHead;

// 创建单链表
PListHead CreateList()
{
    PListHead pListHead = (PListHead)malloc(sizeof(ListHead));
    if (pListHead == NULL)
    {
        return NULL;
    }
    pListHead->pNext = NULL;
    return pListHead;
}

// 释放单链表
void DestroyList(PListHead pListHead)
{
    PListNode pListNode = (PListNode)pListHead;
    while (pListNode)
    {
        PListNode p = pListNode;
        pListNode = pListNode->pNext;
        if (p == NULL)
            break;
        free(p);
    }
}



// 插入节点元素
void Inster(PListHead pListHead, const int nPos, const int nData)
{
    PListNode pListNode = (PListNode)pListHead;
    for (int i = 0; i < nPos;i++)
    {
        pListNode = pListNode->pNext;
        if (pListNode == NULL)
        {
            break;
        }
    }
    
    PListNode pNode = (PListNode)malloc(sizeof(ListNode));
    pNode->nData = nData;
    pNode->pNext = pListNode->pNext;
    pListNode->pNext = pNode;

}

// 前面插入
void BeginInter(PListHead pListHead, const int nData)
{
    Inster(pListHead, 0, nData);
}

int GetCount(const PListHead pListHead);
// 后面插入
void EndInter(PListHead pListHead, const int nData)
{
    Inster(pListHead, GetCount(pListHead), nData);
}

// 获取节点数量
int GetCount(const PListHead pListHead)
{
    PListNode pListNode = (PListNode)pListHead;
    int nCount = 0;
    while (pListNode)
    {
        pListNode = pListNode->pNext;
        if (pListNode == NULL)
            break;
        nCount++;
    }
    return nCount;
}
// 判断是否为空
bool IsEmpty(const PListHead pListHead)
{
    if (GetCount(pListHead) == 0)
        return true;
    return false;
}

// 打印链表
void ShowList(const PListHead pListHead)
{
    PListNode pListNode = pListHead->pNext;
    while (pListNode)
    {
        printf("%d->", pListNode->nData);
        pListNode = pListNode->pNext;
    }
    printf("NULL\n");
}

int main()
{
    // 创建节点
    PListHead pList = CreateList();
    // 链表信息
    printf("节点数量:%d\n", GetCount(pList));
    printf("%s\n", IsEmpty(pList) ? "链表为空" : "链表不为空");

    // 任意位置插入数据
    Inster(pList, 0, 10);
    Inster(pList, 0, 20);
    Inster(pList, 0, 30);
    // 前插和后插
    BeginInter(pList, 666);
    EndInter(pList, 777);

    // 遍历链表
    ShowList(pList);

    // 链表信息
    printf("节点数量:%d\n", GetCount(pList));
    printf("%s\n", IsEmpty(pList) ? "链表为空" : "链表不为空");

    // 释放链表
    DestroyList(pList);
    return 0;
}

不带头单链表

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 


typedef struct _ListNode
{
    _ListNode* pNext;
    int nData;
}ListNode, *PListNode;

// 创建单链表
PListNode CreateList()
{
    return NULL;
}

// 释放单链表
void DestroyList(PListNode* ppListNode)
{
    PListNode pListNode = (PListNode)*ppListNode;
    while (pListNode)
    {
        PListNode p = pListNode;
        pListNode = pListNode->pNext;
        if (p == NULL)
            break;
        free(p);
    }
}



// 插入节点元素
void Inster(PListNode* ppListNode, const int nPos, const int nData)
{
    PListNode pNode = (PListNode)malloc(sizeof(ListNode));
    pNode->nData = nData;

    if (*ppListNode == NULL )
    {
        pNode->pNext = NULL;
        *ppListNode = pNode;
    }else
    {
        if( nPos pNext = (*ppListNode);
            (*ppListNode) = pNode;

        }else
        {
            PListNode pListNode = *ppListNode;
            for (int i = 1; i < nPos; i++)
            {
                pListNode = pListNode->pNext;
                if (pListNode->pNext == NULL)
                {
                    break;
                }
            }
            pNode->pNext = pListNode->pNext;
            pListNode->pNext = pNode;
        }
    }
}


// 前面插入
void BeginInter(PListNode* ppListNode, const int nData)
{
    Inster(ppListNode, 0, nData);
}

int GetCount(const PListNode pListHead);
// 后面插入
void EndInter(PListNode* ppListNode, const int nData)
{
    Inster(ppListNode, GetCount(*ppListNode), nData);
}

// 获取节点数量
int GetCount(const PListNode pListHead)
{
    PListNode pListNode = (PListNode)pListHead;
    int nCount = 0;
    while (pListNode)
    {
        pListNode = pListNode->pNext;
        nCount++;
    }
    return nCount;
}
// 判断是否为空
bool IsEmpty(const PListNode pListHead)
{
    if (GetCount(pListHead) == 0)
        return true;
    return false;
}

// 打印链表
void ShowList(const PListNode pListNode )
{
    PListNode pNode = pListNode;
    while (pNode)
    {
        printf("%d->", pNode->nData);
        pNode = pNode->pNext;
    }
    printf("NULL\n");
}

int main()
{
    // 创建节点
    PListNode pNode = CreateList();
    // 链表信息
    printf("节点数量:%d\n", GetCount(pNode));
    printf("%s\n", IsEmpty(pNode) ? "链表为空" : "链表不为空");

    // 任意位置插入数据
    Inster(&pNode, 0, 10);
    Inster(&pNode, 0, 20);
    Inster(&pNode, 0, 30);
    Inster(&pNode, 1, 40);
    // 前插和后插
    BeginInter(&pNode, 666);
    EndInter(&pNode, 777);

    // 遍历链表
    ShowList(pNode);

    // 链表信息
    printf("节点数量:%d\n", GetCount(pNode));
    printf("%s\n", IsEmpty(pNode) ? "链表为空" : "链表不为空");

    // 释放链表
    DestroyList(&pNode);
    return 0;
}

插入

头部插入

p->next = head;
head = p;

指定位置插入

p->next = q->next;
q->next = p;

删除

删除表头节点

q = head;
head = head->next;
free(q);

删除表中节点

p = q->next;
q->next = p->next;
free(p);

遍历节点

while(p!=NULL)
{
    // 输出数据
    // ...
    // 滑动指针
    p = p->next;
}