首页 > 其他分享 >c语言实现有头单向链表

c语言实现有头单向链表

时间:2023-03-02 13:11:06浏览次数:33  
标签:LinkList head list 单向 有头 next 链表 pos data

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
//采用有头链表,头节点不存数据,所以数据操作都从头节点所指的下一节点开始,这样就不会误操作到头节点。

typedef int data_t;
typedef struct linklist
{
    data_t data;
    struct  linklist *next;
    
}LinkList;
//创建头节点
LinkList * create_linklist(){
    LinkList *head = (LinkList *)malloc(sizeof(LinkList));
    if(NULL == head){
        printf("malloc failed\n");
        return NULL;
    }
    head->data = 0;
    head->next = NULL;
    return head;

}
//判断是否为空
int is_empty(LinkList *head){
    if(head->next == NULL)
        return 0;
    else
        return 1;
}
int len_of_linklist(LinkList *head){
    int cnt=0;
    if(head->next == NULL){
        return cnt;
    }
    while(head->next){
        cnt++;
        head=head->next;
    }
    return cnt;
}
//头插法添加数据,从头结点后添加结点存储数据

void head_add_list(LinkList *head,data_t data)
{
    LinkList *new = (LinkList *)malloc(sizeof(LinkList));
    if(NULL == new){
        printf("malloc failed\n");
    }
    new->data = data;
    new->next  = head->next;
    head->next = new;
    
}
//按位置插入
void pos_add_list(LinkList *head,int pos,data_t data)
{
    LinkList *new = (LinkList *)malloc(sizeof(LinkList));
    if(NULL == new){
        printf("malloc failed\n");
    }
    LinkList *p=head;
    if(pos<0 || pos > len_of_linklist(head))
        return ;

    while(pos--){
        p=p->next;
    }

    new->data = data;
    new->next = p->next;
    p->next = new;
}
void pos_del_list(LinkList *head,int pos)
{
    LinkList *p = head;
    while(pos--){
        p=p->next;
    }
    LinkList *q=p->next;
    p->next = p->next->next;
    free(q);
    q=NULL;

}
void printf_list(LinkList * head)
{
    if(head == NULL){
        return ;
    }
    LinkList *p = head->next;
    while (p != NULL)
    {
        printf("list=%d\n",p->data);
        p=p->next;
    }
    
}
void list_dele(LinkList *head)
{
    LinkList *p=head->next;
    int pos = len_of_linklist(head);
    while(pos-- && pos>=0){
        pos_del_list(head,pos);
    }
    return;
}

//销毁链表
void destory_list(LinkList ** head){ //清除头指针
    if(is_empty(*head) == 0){
        free(*head);
        *head=NULL;
    }else
        printf("链表不为空,长度为=%d\n",len_of_linklist(*head));
}
int main(int argc, char const *argv[])
{
    LinkList *head=create_linklist();
    //head_add_list(head,5);
    head_add_list(head,4);
    head_add_list(head,3);
    head_add_list(head,2);
    head_add_list(head,1);
    printf_list(head);
    list_dele(head);
    destory_list(&head);
    printf_list(head);
    
    return 0;
}

  

标签:LinkList,head,list,单向,有头,next,链表,pos,data
From: https://www.cnblogs.com/yyg-cn/p/17171458.html

相关文章

  • 代码随想录训练营day 4|链表基础理论,移除链表元素,设计链表,反转链表
    链表理论基础链表是一种由指针串联在一起的线性结构,每一个节点都由一个数据域和一个指针域组成。链表的类型有:单链表、双链表、循环链表。链表的存储方式:在内存中不连续......
  • pat乙级:模拟链表问题(汇总,包含所有pat中链表题目分析)
    更新:优化文章结构,增加了部分内容如(1110区块反转)和自己代码和他人代码分析。看完你就懂了转载请注明出处和链接地址:(https://www.cnblogs.com/ahappyfool/p/17156470.htm......
  • 四种语言刷算法之删除链表的倒数第 N 个结点
    力扣19.删除链表的倒数第N个结点1、C/** *Definitionforsingly-linkedlist. *structListNode{ *  intval; *  structListNode*next;......
  • 【基本数据结构】链表
    链表通过指针将一组零散的内存串联在一起,也是一种非常基础、非常常用的数据结构。 一、常见的3种链表从内存的角度来看,数组需要一块连续的内存空间,对内存的要求比较高......
  • 链表 I
    目录链表应用应用1:Leetocde.86题目解题思路代码实现链表应用应用1:Leetocde.86题目86.分隔链表解题思路在遍历过程中,将原有的链表分成两部分,使用两个\(dumy\)节点......
  • golang 实现链表爽不爽?
    犹记得刚学C语言的时候,学到指针这一章,就会有让我们写链表的需求,头插法,尾插法,翻转链表,合并链表,约瑟夫环等等学的不亦乐乎,但是对于指针刚学的时候,真是摸不着脑壳,不知道x......
  • 力扣中19 删除链表的倒数第N个节点
     就是双指针移动呢忽略了特殊情况的判断有可能是设置的标记倒数第n个节点的指针还没移动呢形如例子【1,2  n=2】或者链表很短都不存loc下下个元素会找不到溢出......
  • 链表双指针技巧
    题目难度要点分隔链表●快慢指针:不用两个新链表拼接,使用原地修改合并K个升序链表●最小堆:类ProirityQueue的使用环形链表●快慢指针:相遇有环......
  • Go组件库总结之介入式链表
    本篇文章我们用Go封装一个介入式的双向链表,目的是将链表的实现和具体元素解耦。文章参考自:https://github.com/brewlin/net-protocol1.元素的接口typeElementinterface......
  • 彻底搞懂React-hook链表构建原理
    写在前面的小结每一个hook函数都有对应的hook对象保存状态信息useContext是唯一一个不需要添加到hook链表的hook函数只有useEffect、useLayoutEffect以及us......