现在的位置: 首页 > 综合 > 正文

C 链表(单链表的操作)

2017年12月27日 ⁄ 综合 ⁄ 共 1511字 ⁄ 字号 评论关闭

我没写注释

link.h

#ifndef LINKEDLIST_H
#define LINKEDLIST_H

typedef struct node *link;

struct node
{
 unsigned char item;
 link next;
};

link make_node(unsigned char item);
void free_node(link p);
link search(unsigned char key);
void insert(link p);
link delete(link p);
void traverse(void(*visit)(link));
void destroy(void);
void push(link p);
link pop(void);

#endif

 

link.c

#include <stdio.h>
#include <stdlib.h>
#include "link.h"

static link head = NULL;

link make_node(unsigned char item)
{
 link p=malloc(sizeof *p);
 p->item = item;
 p->next = NULL;
 return p;
}

void free_node(link p)
{
 free(p);
}

link search(unsigned char key)
{
 link p;
 for (p=head;p;p=p->next)
  if (p->item == key)
   return p;
 return NULL;
}

void insert(link p)
{
 p->next=head;
 head=p;
}

link delete(link p)
{
 link prev;
 if (p==head)
 {
  head=p->next;
  return p;
 }
 for (prev=head;prev;prev=prev->next)
  if (prev->next == p)
  {
   prev->next=p->next;
   return p;
  }
 return NULL;
}

void traverse(void (*visit)(link))
{
 link p;
 for(p=head;p;p=p->next)
  visit(p);
}

void destroy(void)
{
 link q, p=head;
 head=NULL;
 while(p)
 {
  q=p;
  p=p->next;
  free(q);
 }
}

void push(link p)
{
 insert(p);
}

link pop(void)
{
 if (head==NULL)
  return NULL;
 else
  return delete(head);
}

void printf_item(link p)
{
 printf("%d\n",p->item);
}
int main(void)
{
    link p=make_node(10);
    insert(p);
    p=make_node(5);
    insert(p);
    p=make_node(90);
    insert(p);
    p=search(5);
    delete(p);
    free_node(p);
    traverse(printf_item);
    destroy();

    p=make_node(100);
    push(p);
    p=make_node(200);
    push(p);
    p=make_node(220);
    push(p);
    while(p=pop())
    {
        printf_item(p);
        free_node(p);
    }
    return 0;
}

抱歉!评论已关闭.