链表(一)——基础操作

126 阅读2分钟

链表基础操作

介绍

链表是一种非常基础的数据结构,也很重要,也比较简单,所以就不多加赘述直接给出代码,这里采用的是尾接法建立链表,实现了增、删、查、遍历、求长度的功能

代码实现及结果

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
#include <windows.h>
typedef struct NODE
{
    int data;
    struct NODE *pNext;
} node;                       //定义链表节点的类型
node *create_node(int size);  //创建链表
bool insert_node(node *, int, int);
bool is_empty(node *);
bool delete_node(node *, int,int*);
int search_node(node *, int);
int length_node(node *);
void print_node(node *pHead); //打印链表
int main()
{
    node *pHead;
    int length;
    int val;
    printf("please put the length of list:");
    scanf("%d", &length);
    pHead = create_node(length);
    print_node(pHead);
    printf("\n");
    insert_node(pHead,2, 2);
    print_node(pHead);
    printf("\n");
    delete_node(pHead, 2, &val);
    print_node(pHead);
    printf("\n");
    printf("%d has been deleted\n", val);
    printf("the length of nodelist is %d\n", length_node(pHead));
    printf("the position of 3 is:%d",search_node(pHead, 3));

}

node *create_node(int size)
{
    int i, val;
    node *phead = (node *)malloc(sizeof(node)); //创建头节点的“分身”,利用“分身”创建一个链表之后返回分身地址,pHead就构成了一个链表的头节点
    phead->pNext = NULL;
    node *p = phead;
    for (i = 0; i < size; i++) //根据输入的length创建新节点
    {
        node *pNew = (node *)malloc(sizeof(node));
        scanf("%d", &val);
        pNew->data = val;
        p->pNext = pNew; //先让新节点指针指向头节点后继节点
        p = pNew;        //再让头节点指向新节点
    }
    p->pNext = NULL; //尾节点要置NULL否则野指针循环无法结束
    return phead;
}

bool insert_node(node *pHead, int position, int val)
{
    node *p = pHead;
    int i;
    for (i = 1; i < position;i++)   //让p指向要插入位置的前一个结点
    {
        p = p->pNext;
    }
    node *pNew = (node *)malloc(sizeof(node));
    pNew->data = val;
    pNew->pNext = NULL;         
    pNew->pNext = p->pNext;     //这两步顺序不可以颠倒,否则会造成指针丢失
    p->pNext = pNew;
}

bool is_empty(node* pHead)
{
    if(pHead->pNext==NULL)
    {
        return true;
    }else
    {
        return false;
    }
    
}

bool delete_node(node* pHead,int position,int* val)
{
    node *p = pHead;
    int i;
    if(is_empty(pHead))
    {
        return false;
    }
    for (i = 1; i < position; i++) //让p指向要删除位置的前一个结点
    {
        p = p->pNext;
    }
    node *temp = p->pNext;  //临时节点存储删除节点的地址便于手动释放内存
    p->pNext = temp->pNext;//更新节点的指向关系
    *val = temp->data;  //储存删除节点的值
    free(temp);         //手动释放动态内存
    temp = NULL;        //节点置空
    return true;
}

int length_node(node* pHead)
{
    int cnt = 0;
    node *p = pHead;
    while(p!=NULL)
    {
        cnt++;
        p = p->pNext;
    }
    return cnt;
}

int search_node(node* pHead,int val)
{
    node *p = pHead->pNext;
    int position=1;
    while(p!=NULL)
    {
        if(p->data==val)
        {
            return position;
        }
        p = p->pNext;
        position++;
    }
    return -1;
}
void print_node(node *pHead)
{
    printf("It's the time to print node.\n");
    node *q = pHead->pNext;
    while (q != NULL)
    {
        printf("%d\t", q->data);
        q = q->pNext;
    }
    q = NULL;
}

在这里插入图片描述