单链表

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


typedef enum SEX SEX;


enum SEX
{
    male = 0,
    female = 1
};


typedef  struct  student_node student_node;


struct student_node
{
    unsigned int m_id;
    unsigned char m_age;
    SEX m_sex;
    char * m_name;
    student_node *m_next;
};


//创建头节点
student_node * head = NULL;


//创建节点
static student_node * mk_node(unsigned int id,unsigned char age,const char *name,SEX sex)
{
    student_node * p= NULL;
    p = ( student_node *)malloc(sizeof(student_node));
    if(p == NULL)
    {
        printf("malloc failed\n");
        return NULL;
    }else
    {
        p->m_name = (char *)malloc(20);
        if(p->m_name == NULL)
        {
            printf("malloc failed...\n");
            return NULL;
        }else
        {
            p->m_id = id;
            p->m_age = age;
            strncpy(p->m_name,name,20);
            p->m_sex = sex;
            p->m_next = NULL;


            return p;
        }


    }
}




//表头插入节点,一直换head
int insert_node_head(student_node * now)
{
    now->m_next = head;
    head = now;


    return 0;
}


//表尾插入节点
int insert_node_tail(student_node * now)
{
    student_node * p = head;


    if(head == NULL)
    {
       // printf("list is empty\n");
        head = now;
    }else
    {
        //printf("list is not empty\n");
        while(p->m_next != NULL)
        {
            p = p->m_next;
        }
        p->m_next = now;
    }
}


//遍历节点,返回链表的长度
int traverse_node(void)
{
    student_node * p= head;
    int cnt = 0;


     if(head != NULL)
     {
        printf("---------------first------------\n");
        printf("ID=%d\n",p->m_id);
        printf("SEX= %d\n",p->m_sex);
        printf("AGE = %d\n",p->m_age);
        printf("NAME= %s\n",p->m_name);
        printf("--------------------------------\n");
        cnt++;
     }
    while(p->m_next != NULL)
    {
        p = p->m_next;
        cnt++;
        printf("--------------------------------\n");
        printf("ID=%d\n",p->m_id);
        printf("SEX= %d\n",p->m_sex);
        printf("AGE = %d\n",p->m_age);
        printf("NAME= %s\n",p->m_name);
        printf("--------------------------------\n");


    }


    return cnt;
}




static void print_infor(student_node *addr)
{
    printf("--------------------------------\n");
    printf("ID=%d\n",addr->m_id);
    printf("SEX= %d\n",addr->m_sex);
    printf("AGE = %d\n",addr->m_age);
    printf("NAME= %s\n",addr->m_name);
    printf("--------------------------------\n");
}


student_node * find_node(unsigned int id)
{
    student_node * p = head;


  //先看第一个节点是不是
    if(head != NULL)
    {
        if(p->m_id == id)
            return p;
    }
    // 用p->m_next 做判断时
    while(p->m_next != NULL)
    {
        if(p->m_id == id)
            break;
        p = p->m_next;
    }
    
    return p;
}


//删除某个节点
int delete_node (student_node * p)
{
    student_node *pre = head;
    //删除第一个节点
    if(p == head)
    {
        head = p->m_next;
        free(p->m_name);
        free(p);


        return;
    }
    //删除一般节点
    //上一个节点的m_next    指向当前节点的m_next
    // 关键是寻找上一个节点
    while(pre->m_next != NULL)
    {
        if(pre->m_next == p)
        {
            pre->m_next = p->m_next;
            free(p->m_name);
            free(p);
        }
        pre = pre->m_next;
    }


    return;
    
}


//清空链表
int destory_list()
{
    student_node *p = head;
     if(head != NULL)
     {
         free(head->m_next);
         free(head);
     }
     while(p->m_next != NULL)
     {
            free(p->m_name);
            free(p);
            p = p->m_next;
     }


     return;
}


int main()
{


    student_node *addr;
    int cnt;
    //student_node * mk_node(unsigned int id,unsigned char age,char *name,SEX sex)
    addr = mk_node(1,10,"james",male);
    insert_node_head(addr);
    //print_infor(addr);




    addr = mk_node(2,3,"hellotitty",female);
    insert_node_tail(addr);
    //print_infor(addr);


    addr = mk_node(3,100,"superman",male);
    insert_node_tail(addr);
    //print_infor(addr);
    cnt = traverse_node();
    printf("%d\n",cnt);


    addr = find_node(2);
    if(addr != NULL)
        delete_node (addr);


    cnt = traverse_node();
    printf("%d\n",cnt);


    destory_list();


    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值