单链表实现实例

/* list.h */

#ifndef _LINKLIST_H

#define _LINKLIST_H



struct node {

    int data;

    struct node *next;

};



typedef struct node *ptr_to_node;

typedef struct node *position;

typedef struct node *list;



list create_list();

void insert(int x, list l, position p);

void insert_to_head(int x, list l);

void insert_to_tail(int x, list l);

position find_previous(int x, list l);

int is_last(position p, list l);

void delete(int x, list l);

void printl(list l);

void make_empty(list l)



#endif
/* list.c */

#include "list.h"

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>



list 

create_list()

{

    list l;

    l = malloc(sizeof(struct node));

    if(l == NULL)

    {

        perror("malloc error");

        exit(1);

    }

    l->next = NULL;



    return(l);

}



void 

insert(int x, list l, position p)

{

    position newnode;

    newnode = malloc(sizeof(struct node));



    if(newnode == NULL)

    {

        perror("malloc error");

        exit(1);

    }

    newnode->data = x;

    newnode->next = p->next;

    p->next = newnode;

}

void

insert_to_head(int x, list l)

{

    insert(x, l, l);

}

void

insert_to_tail(int x, list l)

{

    ptr_to_node nptr;



    nptr = l;

    while(nptr->next != NULL)

        nptr = nptr->next;

    insert(x, l, nptr);

}

position

find_previous(int x, list l)

{

    position p;

    

    p = l;

    while(p->next != NULL && p->next->data != x)

        p = p->next;



    return(p);

}

int

is_last(position p, list l)

{

    return(p->next == NULL);

}

void

delete(int x, list l)

{

    position p, tmpp;



    p = find_previous(x, l);



    if( !is_last(p, l))

    {

        tmpp = p->next; 

        p->next = tmpp->next;

        free(tmpp);

    }

}

void printl(list l)

{

    position p;

    

    p = l->next;

    while(p != NULL)

    {

        printf("%d->", p->data);

        p = p->next;

    }

    printf("NULL\n");

}

  void make_empty(list l)
  {
      ptr_to_node p, p_next;

      p = l->next;
      while(p != NULL)
     {
         p_next = p->next;
         free(p);
         p = p_next;
     }
     l->next = NULL;
  }

 
/* test.c */

#include "list.h"

#include <stdio.h>



int

main(void)

{    

    list l;

    l = create_list();

    printf("insert from list tail:\n");

    insert_to_tail(1, l);

    insert_to_tail(2, l);

    insert_to_tail(3, l);

    insert_to_tail(4, l);

    insert_to_tail(5, l);

    printl(l);

    printf("after delete 3:\n");

    delete(3, l);

    printl(l);



    putchar('\n');

    printf("insert from list head:\n");

    insert_to_head(1, l);

    insert_to_head(2, l);

    insert_to_head(3, l);

    insert_to_head(4, l);

    insert_to_head(5, l);

    printl(l);

    printf("after delete 3:\n");

    delete(3, l);

    printl(l);

}

 

编译运行:

image

你可能感兴趣的:(单链表)