码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构-线性表单链表(C语言实现)

时间:2020-06-17 18:25:28      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:操作   分配   void   lse   编写   std   eof   data   内存分配   

1. 导入头文件

编写代码过程中,涉及动态内存分配等常用的函数,需要引入如下头文件

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

2. 结构体的定义

// 定义一个 结构体
typedef struct Node
{
    int data;
    struct Node * next;
} NODE, *PNODE;

3. 对操作进行声明

PNODE init();    // 初始化
void show(PNODE pHead);    // 列出所有元素
int isEmpty(PNODE pHead); // 是否为空
void append(PNODE pHead, int val);      // 追加
void insert(PNODE pHead, int pos, int val);  // 插入
void delete(PNODE pHead, int pos, int * pVal);  // 删除

4. 初始化

初始化操作生成一个头结点,将头节点的地址返回即完成初始化操作

PNODE init()
{
    PNODE pHead = (PNODE) malloc(sizeof(NODE));
    if (NULL == pHead)
    {
        printf("内存分配失败");
        exit(-1);
    }
    pHead->next=NULL;
    return pHead;
}

5. 判断是否为空

如果头结点指向的后继节点为空,则表示该链表为空

int isEmpty(PNODE pHead)
{
    if (pHead->next==NULL)
    {
        return 1;
    }
    return 0;
}

6. 展示所有元素

从首节点开始,依次遍历后继节点

void show(PNODE pHead)
{
    if (isEmpty(pHead))
    {
        printf("链表元素为空\n");
    } else
    {
        PNODE p = pHead->next;
        while (p!=NULL)
        {
            printf("%d,", p->data);
            p=p->next;
        }
        printf("\n");
    }
}

7. 追加元素

通过 while 找到尾节点,在尾节点后加节点

void append(PNODE pHead, int val)
{
    PNODE p = pHead;
    while (p->next!=NULL)
    {
        p=p->next;
    }
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if (NULL == pNew)
    {
        printf("内存分配失败");
        exit(-1);
    }
    pNew->data = val;
    pNew->next = NULL;

    p->next = pNew;
}

8. 在指定位置插入元素

void insert(PNODE pHead, int pos, int val)
{
    int i = 0;
    PNODE p = pHead;
    while (p!=NULL && i<pos-1)
    {
        p = p->next;
        i++;
    }

    if (p==NULL || i>pos-1)
    {
        printf("pos not valid");
        exit(-1);
    }

    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if (NULL == pNew)
    {
        printf("内存分配失败");
        exit(-1);
    }
    pNew->data=val;
    pNew->next = p->next;
    p->next = pNew;

}

9. 指定位置删除元素

void delete(PNODE pHead, int pos, int * pVal)
{
    int i = 0;
    PNODE p = pHead;

    while (p->next!=NULL && i<pos-1)
    {
        p = p->next;
        i++;
    }

    if (p->next==NULL || i>pos-1)
    {
        printf("pos not valid");
        exit(-1);
    }

    PNODE q = p->next;
    *pVal = q->data;
    p->next = q->next;
    free(q);
    q = NULL;
}

10. main函数

int main()
{
    int val;
    PNODE pHead = NULL;
    pHead = init();
    printf("%d\n", isEmpty(pHead));
    append(pHead, 1);
    append(pHead, 2);
    append(pHead, 3);
    append(pHead, 4);
    insert(pHead, 5, 22);

    show(pHead);
    delete(pHead, 4, &val);
    show(pHead);

    return 0;
}

数据结构-线性表单链表(C语言实现)

标签:操作   分配   void   lse   编写   std   eof   data   内存分配   

原文地址:https://www.cnblogs.com/sugare/p/13153781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!