C语言链表的基本操作

一、链表介绍

链表是一个数据结构,通常用来存储具有相同数据类型的一系列元素。链表中的每个元素都包含一个指向相邻元素的指针,这些指针将链表内的元素连接在一起,形成一个链式结构。

二、链表的基本操作

1. 创建链表

struct Node{
    int data;
    struct Node *next;
};

struct Node *create_list(int n){
    struct Node *head=NULL, *p, *prev;
    int i=0;

    for(i;idata);
        p->next=NULL;

        if(head==NULL){
            head=p;
            prev=p;
        }
        else{
            prev->next=p;
            prev=p;
        }
    }

    return head;
}

创建链表的基本思想是遍历用户输入的元素数据,将每个元素创建成一个节点,并通过指针将它们串联成链表。本代码中使用的是头插法,即每次创建新节点都插入到链表头部。

2. 插入节点

struct Node *insert_node(struct Node *head, int pos, int data){
    struct Node *p, *prev, *cur;
    int i;

    p = (struct Node*)malloc(sizeof(struct Node));
    p->data=data;
    p->next=NULL;

    if(head==NULL){
        head=p;
        return head;
    }

    if(pos==1){
        p->next=head;
        head=p;
        return head;
    }

    cur=head;
    prev=NULL;
    for(i=1;inext;
    }

    p->next=cur;
    prev->next=p;

    return head;
}

插入节点的基本思想是找到要插入节点的位置,并将要插入节点的指针指向该位置后面的节点。本代码中实现的插入功能只能在链表中间插入一个节点,如果想在链表尾插入节点,则需要重新为方法设计代码。

3. 删除节点

struct Node *delete_node(struct Node *head, int pos){
    struct Node *prev, *cur;

    if(head==NULL){
        return head;
    }

    if(pos==1){
        cur=head;
        head=head->next;
        free(cur);
        return head;
    }

    cur=head;
    prev=NULL;
    int i;
    for(i=1;inext;
    }

    if(cur==NULL){
        return head;
    }

    prev->next=cur->next;
    free(cur);

    return head;
}

删除节点的基本思想是找到要删除节点的位置,并将其前一个节点的指针指向其后一个节点。本代码中实现的删除功能只能删除链表中间的一个节点。

4. 查找节点

int find_node(struct Node *head, int data){
    struct Node *p=head;
    int i=0;

    while(p!=NULL){
        i++;
        if(p->data==data){
            return i;
        }
        p=p->next;
    }

    return -1;
}

查找节点的基本思想是遍历整个链表,逐一比对所有节点中是否有值和目标值相等的节点。本代码中查找的是第一个等于目标值的节点。

三、链表的应用

1. 使用链表实现栈数据结构

struct StackNode{
    int data;
    struct StackNode *next;
};
typedef struct StackNode StackNode;

struct StackList{
    StackNode *top;
};
typedef struct StackList StackList;

void init_stack(StackList *stack){
    stack->top = NULL;
}
int is_empty(StackList *stack){
    if(stack->top == NULL){
        return 1;
    }
    else{
        return 0;
    }
}

int push(StackList *stack, int data){
    StackNode *new_node = (StackNode*)malloc(sizeof(StackNode));
    if(new_node == NULL){
        return -1;
    }
    new_node->data = data;
    new_node->next = stack->top;
    stack->top = new_node;
    return 0;
}

int pop(StackList *stack){
    StackNode *p;
    int data;
    if(is_empty(stack)){
        return -1;
    }
    p = stack->top;
    stack->top = p->next;
    data = p->data;
    free(p);
    return data;
}

int get_top(StackList *stack){
    if(is_empty(stack)){
        return -1;
    }
    return stack->top->data;
}

栈是一种数据结构,常用操作包括入栈、出栈、查看栈顶元素等。

2. 使用链表实现队列数据结构

struct QueueNode{
    int data;
    struct QueueNode *next;
};

struct Queue{
    QueueNode *front;
    QueueNode *rear;
};
typedef struct Queue Queue;


void init_queue(Queue *queue){
    queue->front = NULL;
    queue->rear = NULL;
}

int is_empty(Queue *queue){
    if(queue->front == NULL){
        return 1;
    }
    else{
        return 0;
    }
}

int enqueue(Queue *queue, int data){
    QueueNode *new_node = (QueueNode*)malloc(sizeof(QueueNode));
    if(new_node == NULL){
        return -1;
    }
    new_node->data = data;
    new_node->next = NULL;
    if(queue->front == NULL){
        queue->front = new_node;
        queue->rear = new_node;
    }
    else{
        queue->rear->next = new_node;
        queue->rear = new_node;
    }
    return 0;
}

int dequeue(Queue *queue){
    QueueNode *p;
    int data;
    if(is_empty(queue)){
        return -1;
    }
    p = queue->front;
    queue->front = p->next;
    if(queue->front == NULL){
        queue->rear = NULL;
    }
    data = p->data;
    free(p);
    return data;
}

int get_front(Queue *queue){
    if(is_empty(queue)){
        return -1;
    }
    return queue->front->data;
}

队列是一种数据结构,常用操作包括入队、出队、查看队首元素等。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/192193.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-30 15:15
下一篇 2024-12-01 09:56

相关推荐

  • 利用Python实现两个链表合并为一个有序链表

    对于开发工程师来说,实现两个链表合并为一个有序链表是必须掌握的技能之一。Python语言在链表处理上非常便利,本文将从多个方面详细阐述如何利用Python实现两个链表合并为一个有序…

    编程 2025-04-29
  • Python栈操作用法介绍

    如果你是一位Python开发工程师,那么你必须掌握Python中的栈操作。在Python中,栈是一个容器,提供后进先出(LIFO)的原则。这篇文章将通过多个方面详细地阐述Pytho…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 学习Python对学习C语言有帮助吗?

    Python和C语言是两种非常受欢迎的编程语言,在程序开发中都扮演着非常重要的角色。那么,学习Python对学习C语言有帮助吗?答案是肯定的。在本文中,我们将从多个角度探讨Pyth…

    编程 2025-04-29
  • Python操作数组

    本文将从多个方面详细介绍如何使用Python操作5个数组成的列表。 一、数组的定义 数组是一种用于存储相同类型数据的数据结构。Python中的数组是通过列表来实现的,列表中可以存放…

    编程 2025-04-29
  • Python被称为胶水语言

    Python作为一种跨平台的解释性高级语言,最大的特点是被称为”胶水语言”。 一、简单易学 Python的语法简单易学,更加人性化,这使得它成为了初学者的入…

    编程 2025-04-29
  • Python基本索引用法介绍

    Python基本索引是指通过下标来获取列表、元组、字符串等数据类型中的元素。下面将从多个方面对Python基本索引进行详细的阐述。 一、列表(List)的基本索引 列表是Pytho…

    编程 2025-04-29
  • Python基本数字类型

    本文将介绍Python中基本数字类型,包括整型、布尔型、浮点型、复数型,并提供相应的代码示例以便读者更好的理解。 一、整型 整型即整数类型,Python中的整型没有大小限制,所以可…

    编程 2025-04-29
  • Python操作MySQL

    本文将从以下几个方面对Python操作MySQL进行详细阐述: 一、连接MySQL数据库 在使用Python操作MySQL之前,我们需要先连接MySQL数据库。在Python中,我…

    编程 2025-04-29
  • OpenJudge答案1.6的C语言实现

    本文将从多个方面详细阐述OpenJudge答案1.6在C语言中的实现方法,帮助初学者更好地学习和理解。 一、需求概述 OpenJudge答案1.6的要求是,输入两个整数a和b,输出…

    编程 2025-04-29

发表回复

登录后才能评论