C语言单向链表实现

C语言实现数据结构的链表

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

// 定义链表的结构体
typedef struct Node
{
    int data;
    struct Node *pNext;
} NODE, *PNODE;

PNODE creat_list(void);
bool empty_list(PNODE);
void show_list(PNODE);
bool insert_list(PNODE, int, int);
bool del_list(PNODE, int, int* );

int main(void)
{
    PNODE pHead = creat_list();
    int val;
    show_list(pHead);
    insert_list(pHead,2,66);
    
    // if(del_list(pHead,2,&val))
    // {
    //     printf("删除成功!为:%d\n",val);
    // }
    // else
    // {
    //     printf("失败!");
    // }
    show_list(pHead);

    return 0;
}

// 创建一个链表
PNODE creat_list(void)
{
    // 创建一个头节点方便链表的操作,这个节点并不保存实际数据
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if (NULL == pHead)
    {
        printf("动态构建节点出错!\n");
        // 终止
        exit(-1);
    }
    // 构建一个一直指向最后一个节点的指针,方便对链表的添加
    PNODE pEnd = pHead;
    pEnd->pNext = NULL;


    printf("请输入你需要的节点个数:");
    int len = 0;
    int i;
    scanf("%d", &len);

    for (i = 0; i < len; i++)
    {
        printf("请输入第%d个节点的值:", i + 1);
        // 接收用户输入的值
        int val;
        scanf("%d", &val);
        // 构建一个新的节点用来添加至链表末尾
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        if (NULL == pNew)
        {
            printf("动态构建节点出错!\n");
            // 终止
            exit(-1);
        }
        // 给节点赋值
        pNew->data = val;
        // 将这个新的节点移动到链表的末尾处
        pEnd->pNext = pNew;
        pNew->pNext = NULL;
        // 链表所指向的最后一个节点改变,这个新加入的节点就是链表目前最后一个节点
        pEnd = pNew;
    }
    return pHead;
}
// 判空
bool empty_list(PNODE pHead)
{
    if (pHead->pNext == NULL)
        return true;
    else
        return false;
}

// 遍历链表
void show_list(PNODE pHead)
{
    if (empty_list(pHead))
    {
        printf("链表为空!");
        return;
    }
    else
    {
        // 一个临时指针,指向第一个节点,代替pHead进行操作,pHead不能改变
        // PNODE p = pHead->pNext;
        // PNODE p = pHead;
        // while (p != NULL)
        // {
        //     printf(" %d  ", p->data);
        //     p = p->pNext;
        // }

        // 这个是可行的,但是第一次为什么没有成功?
        // 不清楚
        PNODE p = pHead;
        while (p->pNext != NULL)
        {
            p = p->pNext;
            printf(" %d  ", p->data);
        }
        
        printf("\n");
    }
}

// 指定位置添加节点
bool insert_list(PNODE pHead, int pos, int val)
{
    // 同样的代替头文件的操作
    PNODE p = pHead;
    int i = 0;
    while (p != NULL && i < pos - 1)
    {
        p = p->pNext;
        i++;
    }
    if (i > pos - 1 || p == NULL)
    {
        return false;
    }

    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if (NULL == pNew)
    {
        printf("动态构建节点出错!\n");
        // 终止
        exit(-1);
    }
    // 给新节点赋值
    pNew->data = val;
    // 指定位置插入新节点
    pNew->pNext = p->pNext;
    p->pNext = pNew;
    return true;
}

// 删除指定位置的节点
bool del_list(PNODE pHead, int pos, int* pVal)
{
    PNODE p = pHead;
    int i = 0;
    while(p != NULL && i < pos - 1)
    {
        p = p ->pNext;
        i++;
    } 
    if(p == NULL || i > pos -1)
    {
        return false;
    }
    PNODE t = p->pNext;
    *pVal = t->data;
    p->pNext = t->pNext;
    free(t);
    t = NULL;
    return true;
}
posted @ 2022-11-11 15:29  愿风带走思绪  阅读(39)  评论(0)    收藏  举报