C语言基础—数据结构之单向循环链表和双向循环链表

数据结构之单向循环链表和双向循环链表

对于很多初学者来说,最头疼的事情莫过于不知道如何下手,俗话说的好:万事开头难。写代码就是不断的仿照别人的代码,根据自己的思路加以理解,最后形成一种编程思想。编程的路上是很艰辛的,应该说,这个世界上学什么都是很艰辛的,只要你坚持下去,总有一天你会成为大神级别,等待的只是时间问题,和你的背后付出。好了,说正题,下面是我整理的一些数据结构中的单向循环链表和双向循环链表
第一章节:单向循环链表
第二章节:双向循环链表
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       

//初始化空链表
typedef struct node
{
    int data;
    struct node *next;
}listnode, *list;

//判断链表是否为空
bool is_empty(list head)
{
    return head->next == NULL;
}

//初始化一个带头节点的链表
list init_list(void)
{
    list mylist = malloc(sizeof(listnode));  //创建一个头节点
    
    mylist->next = mylist;         //单向循环链表指向头节点  mylist->next = mylist;
                                   //单向链表指向 NULL  mylist->next = NULL;

    return mylist;
}

//创建新节点
list creat_node(int data)
{
    list new = malloc(sizeof(listnode));
    if(new != NULL)
    {
        new->data = data;
        new->next = new;   //暂时没有插入链表里
    }
    
    return new;
}
//插入节点
void insert_head(list mylist, int data)
{
    list new_node = creat_node(data);
    list p = mylist;
    
    if(p == NULL || new_node == NULL)
        return;
    
    new_node->next = p->next;
    p->next = new_node;
}

//查找节点
list find_node(list mylist, int data)
{
    list p = mylist;
    while(p->next != mylist)
    {
        if(p->next->data == data)
        {
            return p->next;
        }
        p = p->next;
    }
}

//删除节点
bool remove_node(list mylist, int data)
{
    if(is_empty(mylist))   //如果链表为空,则返回false
        return false;
        
    list p = mylist;
    list q;
    while(p->next != mylist)
    {
        if((p->next)->data == data)
        {
            q = p->next;
            p->next = p->next->next;
            q->next = NULL;
            free(q);
            //当最后面的节点是我们要删除的时候
            if(p->next == mylist)
                break;
        }
        p = p->next;
    }
}

//遍历显示链表
void show(list mylist)
{
    if(is_empty(mylist))
        return;
        
    list p = mylist;
    while(p->next != mylist)
    {
        p = p->next;
        printf("%d\t", p->data);
    }
	printf("\n");
}

int main(int argc, char **argv)
{
    list mylist = init_list();
    if(mylist == NULL)
    {
        printf("创建失败!");
        exit(1);
    }
    int n;
    while(1)
    {
        int ret = scanf("%d", &n);
        if(ret != 1)
        {
            break;
        }
        
        //创建一个新的节点
        list new = creat_node(n);  
        //将新的节点插入链表
        insert_head(mylist, n);
        
        //遍历
        show(mylist);
    }
    //删除节点
    remove_node(mylist, n);
    show(mylist);
}#include 
       
       
        
        
#include 
        
        
          #include 
         
           //初始化空链表 typedef struct node { int data; struct node *next; }listnode, *list; //判断链表是否为空 bool is_empty(list head) { return head->next == NULL; } //初始化一个带头节点的链表 list init_list(void) { list mylist = malloc(sizeof(listnode)); //创建一个头节点 if(mylist != NULL) { mylist->next = NULL; } return mylist; } //创建新节点 list creat_node(int data) { list new = malloc(sizeof(listnode)); if(new != NULL) { new->data = data; new->next = NULL; //暂时没有插入链表里 } return new; } //头插法插入节点:需要知道这个节点插入到哪一个节点P后面,需要有一个新节点 void insert_head(list mylist, int data) { list new_node = creat_node(data); list p = mylist; if(p == NULL || new_node == NULL) return; new_node->next = p->next; p->next = new_node; } //尾插法插入节点:需要知道这个节点插入到哪一个节点P后面,需要有一个新节点 void insert_tail(list mylist, int data) { list new_node = creat_node(data); list p = mylist; while(p->next != NULL) { p = p->next; } p->next = new_node; } //查找节点 list find_node(list mylist, int data) { list p = mylist; while(p->next != NULL) { if(p->next->data == data) { return p->next; } p = p->next; } } //删除节点 bool remove_node(list mylist, int data) { if(is_empty(mylist)) //如果链表为空,则返回false return false; list p = mylist; while(p->next != NULL) { if((p->next)->data == data) { list q = p->next; p->next = p->next->next; q->next = NULL; free(q); //当最后面的节点是我们要删除的时候 if(p->next == NULL) break; } p = p->next; } } //遍历显示链表 void show(list mylist) { if(is_empty(mylist)) return; list p = mylist; while(p->next != NULL) { p = p->next; printf("%d\t", p->data); } printf("\n"); } int main(int argc, char **argv) { list mylist = init_list(); if(mylist == NULL) { printf("创建失败!"); exit(1); } //判断是否为空链表‘ bool y = is_empty(mylist); if(y == true) { printf("则此链表为空链表!"); } int i; //头插法 for(i = 0;i < 5;i++) { insert_tail(mylist, i); } //遍历显示链表 show(mylist); printf("===========================\n"); //删除节点 remove_node(mylist, 1); show(mylist); } 
          
        
       
       
      
      
     
     
    
    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值