不带表头节点的单链表编程(1)

链表

n个节点链接成链表,即线性表。

单链表

若链表的每个结点中只包含一个指针域,该链表称为线性链表或单链表。

这里写图片描述

节点结构体

typedef char ListData;

typedef struct node           //链表结点
{            
    ListData   data;          //结点数据域
    struct node   * link;     //结点链域
} ListNode;

typedef ListNode * LinkList;   

LinkList first;               //链表头指针

编程

/*****************************************************
Author:chenhaha    Version:0.1    Date: 2016.11.1

Funcion List:  实现不带表头节点的单链表的头插和尾查
               实现在指定的数据域后,插入节点
               实现随机删除链表中一个节点
               实现链表的释放
               实现链表数据的显示
*****************************************************/


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

struct node
{
    int num;
    struct node * next;
};

typedef struct node Node;
typedef struct node * Link;

void creat_link(Link * head)
{
    *head = NULL;
}

void insert_node_head(Link * head,Link new_node) //头插
{
    new_node -> next = *head;  //新节点指针域指向头节点
    *head = new_node; //头指针指向新节点
}

void insert_node_tail(Link * head,Link new_node) //尾插
{
    Link tmp;
    tmp = *head;

    if(NULL == *head)     //链表为空时
    {
        new_node -> next = NULL;
        *head = new_node;        //使头头指针指向最新的节点
    } 
    else                  //链表不为空时
    {
        while(tmp->next != NULL)    // while(tmp != NULL)
        {                           // {
            tmp = tmp-> next;       //   tmp = tmp-> next;  此时已经已经指向NULL
        }                           // }

        tmp->next=new_node;
        new_node->next =NULL;
    }
}

void insert_node_mid(Link * head,Link new_node,int num)    //在指定的数据域后,插入节点
{
    Link  tmp = *head;  

    if(NULL == *head)
    {
        printf("link is empty !\n");
        return;
    }
    else
    {
        while(tmp -> num != num && tmp -> next != NULL) //找要插入的位置
        {
            tmp = tmp -> next;
        }

        if(tmp -> num == num)  //找到这个数据所在节点
        {
            new_node -> next = tmp -> next;
            tmp -> next = new_node;
        }
        else//没有这个节点
        {
            printf("no such node!\n");
        }
    }
}

void delete_node(Link * head,int num_delete) //删除指点数据域所在节点
{
    Link tmp = *head;
    Link p   = tmp;

    if(NULL == *head)
    {
        printf("link is empty !\n");
        return;
    }
    else
    {
        while(tmp -> num != num_delete && tmp -> next != NULL)
        {
            p   = tmp;      //需要一个指针用于跟踪
            tmp = tmp -> next;
        }

        if(tmp -> num == num_delete) //找到这个位置
        {
            if(tmp == *head) //是头节点时
            {
                * head =  tmp -> next;
                free(tmp); 
            }
            else            //不是头节点时
            {
                p -> next =  tmp -> next;
                free(tmp);
            }
        }
        else
        {
            printf("no such node!\n");
        }
    }
}
void free_node(Link * head)
{
    Link tmp = *head;

    while(*head != NULL)
    {
        tmp = *head;
        *head = (*head) -> next;
        free(tmp);
    }

    if( *head == NULL)
    {
        printf("link is emtpy\n");
        return;
    }
}

void display(Link head)
{
    Link tmp;
    tmp = head;

    while(tmp != NULL)
    {
        printf("num = %d\n",tmp->num);
        tmp = tmp -> next;
    }
}

int main()
{
    Link head = NULL;
    Link new_node = NULL;
    int i;
    int num_insert,num_delete;

    creat_link(&head);   //创建用于指向表头结点的Link型指针(头指针),此时指向NULL。

    for(i = 0; i <10; i++)
    {
        new_node = (Link)malloc(sizeof(Node)) ;  //创建一个新的节点,返回其地址
        if(NULL == new_node)
        {
            printf("malloc error!\n");
            exit(-1);
        }

        new_node -> num = i;  //节点赋值

    //  insert_node_head(&head,new_node);    //插入节点(头插)
        insert_node_tail(&head,new_node);    //插入节点(尾插)
    }

    display(head);
    printf("请输入要插入的序号:");
    scanf("%d",&num_insert);

    new_node = (Link)malloc(sizeof(Node)) ;  //创建一个新的节点,返回其地址
    if(NULL == new_node)
    {
        printf("malloc error!\n");
        exit(-1);       
    }

    new_node -> num = 321;  //节点赋值

    insert_node_mid(&head,new_node,num_insert);    //插入节点(中间)
    display(head);

    printf("请输入要删除的序号:");
    scanf("%d",&num_delete);

    delete_node(&head,num_delete);
    display(head);

    free_node(&head);
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值