C的链表实现

#include<stdio.h>

#include<stdlib.h>

struct node

{

    int num;

    struct node *next;

};

struct node *head=NULL;

cre_list() //初始化结点

{

    head = (struct node *)malloc(sizeof(struct node));

    head->next = NULL;

}

add_node(int num) //插入结点

{

    struct node *ptr = (struct node *)malloc(sizeof(struct node));

    ptr->num = num;

    ptr->next = head;

    head=ptr;

}

add_five_node(int num) //在5之后插入结点

{

    int i = 0;

    struct node *p,*q;

    p=head;

    q=head;

    struct node *ptr = (struct node *)malloc(sizeof(struct node));

    ptr->num = num;

    while((p->num)!=5)

    {

        p = p->next;

    }

    ptr->next=p->next;

    p->next=ptr;

}

struct node *opp_node(struct node *head)//链表逆序

{

    struct node *p,*front,*q;

    front=NULL;

    p=head;

    while(p!=NULL)

    {

        q=p->next;//尾插入法

        p->next=front;

        front=p;

        p=q;

    }

    head =front;

    return head;

}

display_node() //遍历链表

{

    struct node *p = head;

    do

    {

        printf("%d\t",p->num);

        p = p->next;

    }while(p != NULL);

    printf("\n");

}

delete_node()  //删除偶数结点

{

    struct node *p,*q;  

    p = head;

    q = head->next;

    while(q != NULL)

    {

        if((q->num)%2 == 0)

{   

    p->next=q->next;

    free(q);

    q=p->next;

    continue;

}

p = p->next;

q = q->next;

    }

    if((head->num)%2 == 0)

    {

        p = head;

head = head->next;

free(p);

p = NULL;

    }

}

int main()

{

    int i=0;

    cre_list();

    for(i;i<10;i++)

    {

        add_node(i);

    }

    display_node();

    add_five_node(12);

    add_five_node(14);

    add_five_node(16);

    add_five_node(18);

    display_node();

    delete_node();

    display_node();

head=opp_node(head);

    display_node();

    return 0;

}


链表删除偶结点时,head结点暂不考虑,利用两个指针删除从第二个结点开始的偶结点,待删除完之后,再回头判断头结点是否为偶数,若为偶数则删除头结点。


### C语言实现链表的数据结构 在C语言中,链表是一种常见的动态数据结构,它通过指针连接各个节点来存储数据。以下是关于如何使用C语言实现单向链表的一个基本示例。 #### 单向链表的定义 链表中的每个节点通常由两部分组成:一部分用于保存实际数据,另一部分是一个指向下一个节点的指针。对于最后一个节点,其指针域设置为空(NULL),表示这是链表的末端[^1]。 ```c // 定义链表节点结构体 typedef struct Node { int data; // 存储的数据 struct Node* next; // 指向下一个节点的指针 } Node; ``` #### 创建新节点函数 为了方便创建新的节点并初始化它们的内容,可以编写一个辅助函数`create_node`: ```c Node* create_node(int value) { Node* new_node = (Node*)malloc(sizeof(Node)); // 动态分配内存给新节点 if(new_node != NULL){ new_node->data = value; // 初始化节点数据 new_node->next = NULL; // 设置下一节点地址为NULL } return new_node; // 返回新建节点的地址 } ``` #### 插入操作 这里展示的是在链表头部插入元素的方法。这种方法的时间复杂度较低,因为不需要遍历整个列表即可完成插入动作[^2]。 ```c void insert_at_head(Node** head_ref, int new_data) { Node* new_node = create_node(new_data); // 调用上面定义好的create_node方法生成新节点 if (*head_ref == NULL || new_node == NULL){ // 如果头结点不存在或者无法成功建立新节点,则直接返回 *head_ref = new_node; return ; } new_node->next = *head_ref; // 将当前头结点赋值给新节点的next成员变量 *head_ref = new_node; // 更新头结点位置到最新加入的新节点上 } ``` 以上就是利用C语言构建简单单向链表的过程概述以及一些基础功能演示代码片段。这只是一个非常初步的例子,在实际应用当中可能还需要考虑更多细节比如错误处理机制等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值