浅谈Linux C基础9----数据链表

前言:基于C语言实现数据链表

浅谈Linux C基础9----数据链表_第1张图片

1.实现代码函数:

#include "loop_list.h"
//创建单向循环链表
node_p create_loop()
{
    node_p H = (node_p)malloc(sizeof(node));
    if(H==NULL)
    {
        printf("空间申请失败\n");
        return NULL;
    }
    H->data = 0;  //链表中暂无数据
    H->next = H;  //单向循环链表,尾结点指向头结点,链表为空时,头结点既是尾结点也是头结点
    return H; 
}
//创建结点
node_p create_node(int data)
{
    node_p new = (node_p)malloc(sizeof(node));
    if(new==NULL)
    {
        printf("空间申请失败\n");
        return NULL;
    }
    new->data = data;  //链表中暂无数据
    return new;
}
//判空
int empty_loop(node_p H)
{
    if(H==NULL)
    {
        printf("入参为空\n");
        return -1;
    }
    return H->next==H?1:0;
}
//头插
void insert_head(node_p H,int data)
{
    if(H==NULL)
    {
        printf("入参为空\n");
        return;
    }
    node_p new = create_node(data);
    new->next = H->next;
    H->next = new;
    H->data++;
}
//输出
void show(node_p H)
{
    //入参合理性检查
    if(H==NULL)
    {
        printf("入参为空\n");
        return;
    }
    //判空
    if(empty_loop(H))
    {
        printf("链表为空\n");
        return;
    }
    node_p p = H->next;
    while(p!=H)
    {
        printf("%d->",p->data);
        p = p->next;
    }
    printf("H\n");
}
//尾插
void insert_tail(node_p H,int data)
{
    if(H==NULL)
    {
        printf("入参为空\n");
        return;
    }
    node_p p = H;
    //找到最后一个结点
    while(p->next!=H)
    {
        p = p->next;
    }
    //申请新的结点
    node_p new = create_node(data);
    new->next = p->next;
    p->next = new; //尾结点指向新结点
    H->data++;
}
//头删
void dele_head(node_p H)
{
    if(H==NULL)
    {
        printf("入参为空\n");
        return;
    }
    if(empty_loop(H))
    {
        printf("链表为空\n");
        return;
    }
    node_p del = H->next;
    H->next = H->next->next;
    free(del);
    H->data--;
}
//按位置插入
void insert_pos(node_p H,int data,int pos)
{
    if(H==NULL)
    {
        printf("入参为空\n");
        return;
    }
    //判断位置合理性
    if(pos<=0||pos>H->data+1)
    {
        printf("位置不合理\n");
        return;
    }
    //找到pos-1位置的结点
    node_p p = H;  //记录找到的结点
    for(int i=0;inext);
    node_p new = create_node(data); //创建新结点
    new->next = p->next; //新结点指向原来pos位置的结点
    p->next = new;    //原来pos-1位置结点指向新结点
}
//删除单向循环链表的头结点
node_p dele(node_p H)
{
    if(H==NULL)
    {
        printf("入参为空\n");
        return NULL;
    }
    //把尾结点的指针域指向第一个结点
    //循环找到尾结点
    node_p p = H;
    while(p->next!=H)
    {
        p = p->next;
    }
    //让尾结点指向原来头结点的下一个结点
    p->next = H->next;
    //保存第一个结点的地址
    node_p temp = H->next;
    //释放头结点
    free(H);
    //把可以操作整条链表第一个结点的首地址返回
    return temp;
}
//输出删除头结点后的单向循环链表
void show_no_head(node_p T)
{
    if(T==NULL)
    {
        printf("入参为空\n");
        return;
    }
    node_p p = T;   //从第一个结点开始遍历链表
/*    while(p->next!=T)
    {
        printf("%d->",p->data);
        p = p->next;
    }
    printf("%d->T\n",p->data);*/
    do
    {
        printf("%d->",p->data);
        p = p->next;
    }while(p!=T);  //使用do···while循环为了让第一个结点进入循环
}
 

2.头文件代码

#ifndef __LOOP_LIST_H__
#define __LOOP_LIST_H__
#include
#include
typedef struct node
{
    int data;
    struct node *next;
}node,*node_p;


//创建单向循环链表
node_p create_loop();
//创建结点
node_p create_node(int data);
//判空
int empty_loop(node_p H);
//头插
void insert_head(node_p H,int data);
//输出
void show(node_p H);
//尾插
void insert_tail(node_p H,int data);
//头删
void dele_head(node_p H);
//按位置插入
void insert_pos(node_p H,int data,int pos);
//删除单向循环链表的头结点
node_p dele(node_p H);
//输出删除头结点后的单向循环链表
void show_no_head(node_p T);


#endif
 

3.main代码

#include "loop_list.h"
int main()
{
    node_p H = create_loop();
    insert_head(H,19);
    insert_head(H,67);
    insert_tail(H,92);
    insert_pos(H,76,0);
    insert_pos(H,123,8);
    show(H);
    node_p T = dele(H); //接收删除头结点后链表中第一个结点的地址
    H = NULL;
    show_no_head(T);
    return 0;
}
 

你可能感兴趣的:(linux,c语言,运维)