C语言带有表头结点的增,删,改,查

函数构架

代表头的意思:在链表中安置一个表头,确定头结点的位置,这样就不需要通过对头地址的改变来对链表进行操作,只需要对头结点的下一个地址操作,因为头结点是确定的所以每次操作不需要修改链表的头地址。

  • 创建结点元素
  • 创建带有表头的空链表
  • 创建结点
  • 对于结点的操作(增、删、改、查)
  • 编译链表

链表的创建,结点组成元素的创建

struct node            //结构体
{
    int num;
    struct node *next;
};

typedef struct node Node;
typedef Node * Link;

函数体的创建
头插

**头插法**
void create_new_node(Link * new_node)
{
    *new_node = (Link)malloc(sizeof(Node));
    is_malloc_ok(*new_node);
}

头结点函数的创建

void create_list(Link *head)
{
    create_new_node(head);
    (*head)->next = NULL;
}

中间结点插入(前、后)

void insert_node_head(Link head,Link new_node)
{
    Link p = NULL;
    Link q = NULL;
    q = head;
    p = q->next;

    while(NULL != p && (p->num) < new_node->num )
    {
        q = p;
        p = p->next;
    }
    new_node->next = p;
    q->next = new_node;
}



void insert_node_mid(Link head,Link new_node,int loc)
{
    Link p = NULL;
    Link q = NULL;

    q = head;
    p = q->next;

    while(NULL != p && p->num != loc)
    {
        q = p;
        p = p->next;
    }
    
    new_node->next = p;
    q->next = new_node;
}

删除结点

void delect_node(Link head,int loc)
{
    Link p;
    Link q;
    q = head;
    p = q->next;
     
    while(NULL != p && p->num != loc)
    {   
        q = p;    
        p = p->next;
    }
        q->next = p->next;
        free(p);
}

查找结点

Link search_node(Link head,int loc)
{
    Link p;
    p = head->next;
    while(NULL != p && p->num != loc)
    {
        p = p->next;
    }
    return p;
}

清空链表(不包括头结点)

void clear_list(Link head)
{
    Link p;
    p = head->next;
    while(NULL != p)
    {
        head->next = p->next;
        free(p);
        p = head->next;
    }
}

清空链表(包括头结点)

void clear_all_list(Link head)
{
    Link p = NULL;
    p = head->next;
    while(NULL != p)
    {
        head->next = p->next;
        free(p);
        p = head->next;
    }
    head = NULL;
}

打印链表

void display(Link head)
{
    Link p;
    p = head->next;
    
    if(NULL != p)
    {
        while(NULL != p)
        {
            printf("%d\n",p->num);
            p = p->next;
        }
    }
    else
    {
        printf("is free\n");        
    }
}

主函数

int main()
{   
    int i;
    Link head;
    Link new_node;
    int loc = 0;    
    Link search = NULL;
    create_list(&head);
    srand(time(NULL));
    
    for(i=0; i < 10; i++)
    {
        create_new_node(&new_node);
        new_node->num = rand() % 100;
        insert_node_head(head,new_node);
    }

        
    display(head);
        
    
/*    create_new_node(&new_node);     //插入结点
    new_node->num = 100;

    printf("输入插入的的行数字:");

    scanf("%d",&loc);

    insert_node_mid(head,new_node,loc);
    
    display(head); */


  /*  printf("请输入删除的行的数字:");
    scanf("%d",&loc);

    delect_node(head,loc);
    display(head);   */

 /*   printf("查找行的数字:");    //查找结点
    scanf("%d",&loc);
    search =  search_node(head,loc);
    
    printf("%d\n",search->num);*/
 

    clear_list(head);   //带表头节点的释放,表头不释放
    clear_all_list(head);   //全部释放 表头也释放
    display(head); 
    return 0;
}
发布了14 篇原创文章 · 获赞 0 · 访问量 413

猜你喜欢

转载自blog.csdn.net/LIGUOZHENLX/article/details/104343504
今日推荐