C语言链表结构(2)——单链表的增删改查

单向链表的增删改查:

1. 设计链表节点
        由于链表节点需要数据域以及指针域(存放着不同类型的数据),所以将每一个节点设计成一个结构体。
结构体模型:
struct data{
  /* 数据域 */
  ...

  /* 指针域 */
  ...
};

例子1: 每一个节点都存放着一个整型数据,那么结构体如何定义?
struct list_node{
  int a;                                                   //数据域
  struct list_node *next;                        //指针域
};

2. 初始化链表 -> 搞一个链表头
struct list_node *init_list_head(struct list_node *head)                        //head = NULL
{
  //为头节点申请空间
  head = (struct list_node *)malloc(sizeof(struct list_node));
  if(head == NULL)
  printf("head malloc error!\n");

  //为头节点的指针域赋值
  head->next = NULL;

  return head;
}

3. 尾插数据 -> 在链表末尾增加一个新的节点
int tail_add_list(struct list_node *head,int num)
{
  //为新节点申请空间
  struct list_node *Node = NULL;
  Node = (struct list_node *)malloc(sizoef(struct list_node));

  //为新节点赋值
  Node->a = num;
  Node->next = NULL;

  //寻找最后一个节点,并尾插
  struct list_node *p = NULL;
  for(p=head;p->next!=NULL;p=p->next);
  //从循环出来时,p->next=NULL,也就是说,p指向最后一个节点!

  p->next = Node;

  return 0;
}

4. 遍历链表
int show_list_node(struct list_node *head)
{
  struct list_node *p = NULL;
  for(p=head->next;p!=NULL;p=p->next)
  {
    printf("%d\n",p->a);
  }

  return 0;
}

5. 头插 -> 在头节点之后插入一个新的节点。
int head_add_list(struct list_node *head,int num)
{
  struct list_node *Node = NULL;
  Node = (struct list_node *)malloc(sizeof(struct list_node));

  Node->a = num;
  Node->next = head->next;
  head->next = Node;

  return 0;
}

6. 根据特征值来寻找节点
int search_list_node(struct list_node *head,int num)
{
  struct list_node *p = NULL;
  for(p=head->next;p!=NULL;p=p->next)
  {
    if(p->a == num)
    {
      show_node(p);
      return 0;
    }
  }

  printf("Not Found:%d\n",num);
  return -1;
}

7. 删除节点
int delete_list_node(struct list_node *head,int num)
{
  struct list_node *p = NULL;
  struct list_node *q = NULL;

  for(q=head,p=head->next;p!=NULL;q=p,p=p->next)
  {
    if(p->a == num)
    {
      q->next = p->next;
      free(p);
      return 0;
    }
  }

  return -1;
}

8. 释放整条链表的空间。
int delete_list(struct list_node *head)
{
  struct list_node *p = NULL;
  struct list_node *q = NULL;

  for(p=q=head;p!=NULL;p=q)
  {
    q=p->next;
    free(p);
  }

  return 0;
}

以上是单向链表的增删改查等功能的实现和用法,单项循环链表则是将最后一个节点的后继指针指向头结点,其他用法根据实际情况更改即可。

posted @ 2019-11-06 10:10  水镜·八咫  阅读(979)  评论(0)    收藏  举报