链表的实现实验

这个是链表的头文件

#ifndef MY_LIST_H
#define MY_LIST_H

/*链表节点的定义*/

typedef struct MyNode
{
  double data; // 数据
  struct MyNode * prev; // 前驱
  struct MyNode * next; // 后继
} my_node;


void add_node(my_node * , my_node * ); ///*链表的增加节点*/

my_node * get_last_node(my_node *); //得到链表最后一个节点

void remove_last_node(my_node *); /*链表的删除最后一个节点*/

void display_list(my_node * head);

my_node * find_node_as_data(my_node * head, double wanted_data);

void display_node(my_node * node);
#endif

这个是链表的c文件

// #include<stdlib.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include"my_list.h"

/*得到链表最后一个节点,如果链表只有一个头节点,那么返回头节点*/
my_node * get_last_node(my_node * head)
{
  my_node * temp_head = head;
  if (temp_head == NULL)
  {
    printf("error,链表为空\n");
  }
  else
  {
    while (temp_head->next != NULL)
    {
      temp_head = temp_head->next;
    }
    return temp_head;
  }
}

/*链表的最后一个节点增加节点,如果链表为空(只有一个头节点),那么在头节点之后添加一个节点*/
void  add_node(my_node * head, my_node * node)
{
  my_node * temp_head = head;
  if (temp_head == NULL)
  {
    // 如果链表是空的,那么返回node节点作为头节点
    printf("现在链表是空的(没有头节点),请您首先创建头节点后,再在之后添加节点\n");
  }
  else if(node != NULL)
  {
    my_node * temp_last_node = get_last_node(temp_head);
    temp_last_node->next = node;
    node->prev = temp_last_node;
    node->next = NULL;
  }
  else
  {
    printf("新加一个空的节点到底要干什么!\n");
  }
}

/*删除链表的最后一个节点*/
void remove_last_node(my_node * head)
{
  my_node * temp_head = head;
  if (temp_head == NULL)
  {
    printf("不要给我空链表好不好\n");
  }
  else if (temp_head->next == NULL)
  {
    printf("链表只有一个头节点了,不能再删除节点了哇\n");
    return ;
  }
  else
  {
    my_node * temp_node = get_last_node(temp_head);
    temp_node->prev->next = NULL;
    free(temp_node);
  }
}

/*显示一个节点的信息*/
void display_node(my_node * node)
{
  if (node == NULL)
  {
    printf("节点是空的哇,不能显示\n");
    return ;
  }
  printf("data is %f, next addr is %x, prev addr is %x\n",node->data, node->next, node->prev);
}

/*显示链表的内容*/
void display_list(my_node * head)
{
  my_node * temp_head = head;
  printf("************************现在开始打印链表***********************\n");
  int i = 0;
  while(temp_head->next != NULL)
  {
    ++i;
    display_node(temp_head);
    temp_head = temp_head->next;
  }

  display_node(temp_head);
  printf("************************现在结束打印链表***********************\n");
}

/*根据节点中的数据寻找这个节点,然回第一个匹配的节点,后面的有没有不管*/
my_node * find_node_as_data(my_node * head, double wanted_data)
{
  my_node * temp_head = head;
  while(temp_head->next != NULL)
  {
    temp_head = temp_head->next;
    if(abs(temp_head->data - wanted_data) < exp(-710))
    {
      return temp_head;
    }
  }
  if (temp_head == get_last_node(head))
  {
    printf("链表中没有包含该数据的节点\n");
    return NULL;
  }
}


void main(void)
{
  
  int i = 0;
  my_node * head = (my_node *)malloc(sizeof(my_node));
  head->data = 100;
  for(i = 0; i < 20; i++)
  {
    my_node * node = (my_node *)malloc(sizeof(my_node));
    node->data = i;
    add_node(head,node);
  }

  display_list(head);
  display_node(find_node_as_data(head,10));
}

这里 是运行结果

************************现在开始打印链表***********************
data is 100.000000, next addr is 21872c0, prev addr is 0
data is 0.000000, next addr is 21872e0, prev addr is 21872a0
data is 1.000000, next addr is 2187300, prev addr is 21872c0
data is 2.000000, next addr is 2187320, prev addr is 21872e0
data is 3.000000, next addr is 2187340, prev addr is 2187300
data is 4.000000, next addr is 2187360, prev addr is 2187320
data is 5.000000, next addr is 2187380, prev addr is 2187340
data is 6.000000, next addr is 21873a0, prev addr is 2187360
data is 7.000000, next addr is 21873c0, prev addr is 2187380
data is 8.000000, next addr is 21873e0, prev addr is 21873a0
data is 9.000000, next addr is 2187400, prev addr is 21873c0
data is 10.000000, next addr is 2187420, prev addr is 21873e0
data is 11.000000, next addr is 2187440, prev addr is 2187400
data is 12.000000, next addr is 2187460, prev addr is 2187420
data is 13.000000, next addr is 2187480, prev addr is 2187440
data is 14.000000, next addr is 21874a0, prev addr is 2187460
data is 15.000000, next addr is 21874c0, prev addr is 2187480
data is 16.000000, next addr is 21874e0, prev addr is 21874a0
data is 17.000000, next addr is 2187500, prev addr is 21874c0
data is 18.000000, next addr is 2187520, prev addr is 21874e0
data is 19.000000, next addr is 0, prev addr is 2187500
************************现在结束打印链表***********************
data is 10.000000, next addr is 2187420, prev addr is 21873e0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值