C语言的数据结构

数据结构:管理数据的方式

重要的数据结构:链表、平衡二叉树、红黑数、哈希表

(一)、链表

节点:1>数据域    2>链接域


单链表特点:最后一个链接域为NULL

带表头的链表特点:头结点无数据域,只有链表域

写链表步骤:
1、定义节点类型
2、确定链接域、数据域:int num;    struct node *next;
3、重命名:typedef struct node Node;    typedef Node *Link;
4、创建链表:Link head;

单向循环链表:

#include <stdio.h>

struct node
{
    int num;

    struct node *next;
};

typedef struct node Node;
typedef Node* Link;

void creat_link(Link *head)
{
    *head = (Link)malloc(sizeof(Node));

    (*head)->next = *head;
}

void insert_head_link(Link *head,Link *newnode)
{
    (*newnode)->next = (*head)->next;

    (*head)->next = *newnode;
}

void display_head_link(Link *head)
{
    Link temp = (*head)->next;

    while(temp != *head)
    {
        printf("%d\n",temp->num);

    temp = temp->next;
    }
}

void insert_tail_link(Link *head,Link *newnode)
{
    Link temp = *head;

    while(temp->next != *head)
    {
        temp = temp->next;
    }

    temp->next = *newnode;
    (*newnode)->next = *head;
}

void insert_mid_nod(int num,Link *head,Link *newnode)
{
    Link temp = *head;

    while(temp->next != *head)
    {
       if(temp->num == num)
       {

           (*newnode)->next = temp->next;
       temp->next = *newnode;
       }

       temp = temp->next;
    }
}

void del_nod(int num,Link *head)
{
    Link temp = *head;
    Link ptr = temp;

    while(temp->next != *head)
    {
        //temp = temp->next;

    if(temp->num == num)
    {
        ptr->next = temp->next;
    }

    ptr = temp;
    temp = temp->next;
    }
}

int link_reverse(Link *head)
{
    if((*head)->next == *head || (*head)->next->next == *head)
    {
        return -1;
    }
    else
    {
        Link ptr = *head;
    Link ktr = ptr->next;
        Link temp = ktr->next;

    while(temp != *head)
    {
         ktr->next = ptr;

         ptr = ktr;
         ktr = temp;
         temp = temp->next;
    }

        ktr->next = ptr;

    (*head)->next->next = *head;
    (*head)->next = ktr;
    }

}

int main()
{
    int i;
    Link head;
    Link newnode;

    creat_link(&head);

    for(i = 0; i < 10; i++)
    {
        newnode = (Link)malloc(sizeof(Node));

    if(newnode == NULL)
    {
        printf("malloc erroe!\n");
        exit(1);
    }
    else
    {
        newnode->num = i + 1;

        //insert_head_link(&head,&newnode);
        insert_tail_link(&head,&newnode);
    }
    }

    //display_head_link(&head);

    newnode = (Link)malloc(sizeof(Node));
    newnode->num = 11;

    //insert_mid_nod(5,&head,&newnode);

    //display_head_link(&head);

    //del_nod(5,&head);

    //display_head_link(&head);

    link_reverse(&head);

    display_head_link(&head);
<p>
    return 0;
}</p>

双向循环链表:

#include <stdio.h>

struct node
{
    int num;

    struct node *prior;
    struct node *next;
};

typedef struct node Node;
typedef Node * Link;

void creat_link(Link *head)
{
    *head = (Link)malloc(sizeof(Node));

    (*head)->prior = *head;
    (*head)->next = *head;
}

void insert_head_node(Link *head,Link *newnode)
{
    (*newnode)->next = (*head)->next;
    (*head)->next->prior = *newnode;

    (*head)->next = *newnode;
    (*newnode)->prior = *head;
}

void insert_tail_node(Link *head,Link *newnode)
{
    (*head)->prior->next = *newnode;
    (*newnode)->prior = (*head)->prior;

    (*head)->prior = *newnode;
    (*newnode)->next = *head;
}

void display_link(Link *head)
{
    Link temp = (*head)->next;

    while(temp != *head)
    {
        printf("%d\n",temp->num);
        temp = temp->next;
    }
}

void insert_mid_node(int num,Link *head,Link *newnode)
{
    Link temp = (*head)->next;

    while(temp != *head)
    {
        if(temp->num == num)
    {
        temp->next->prior = *newnode;
        (*newnode)->next = temp->next;

        (*newnode)->prior = temp;
            temp->next = *newnode;
    }

    temp = temp->next;
    }
}

void del_node(int num,Link *head)
{
    Link temp = (*head)->next;
    Link ptr = temp;

    while(temp != *head)
    {
        if(temp->num == num)
    {
        ptr->next = temp->next;
        temp->next->prior = ptr;
    }

    ptr = temp;
    temp = temp->next;    
    }
}

int main()
{
    int i;
    Link head;
    Link newnode;

    creat_link(&head);

    for(i = 0 ; i < 10; i++)
    {
        newnode = (Link)malloc(sizeof(Node));

    if(newnode == NULL)
    {
        printf("malloc error!\n");
        exit(1);
    }
    else
    {
        newnode->num = i + 1;

        //insert_head_node(&head,&newnode);
        insert_tail_node(&head,&newnode);
    }
    }

    display_link(&head);

    newnode = (Link)malloc(sizeof(Node));
    newnode->num = 11;

    //insert_mid_node(5,&head,&newnode);

    //display_link(&head);

    //del_node(5,&head);

    //display_link(&head);

    return 0;
}

链表逆序:

#include <stdio.h>

struct node
{
    int num;

    struct node *next;
};

typedef struct node Node;
typedef Node* Link;

void creat_head(Link *head)
{
    *head = NULL;
}

void insert_head_link(Link *head,Link *newnode)
{
    (*newnode)->next = *head;
    *head = *newnode;
}

int link_display(Link *head)
{
    if(*head == NULL)
    {
        printf("link empty!\n");
    return -1;
    }
    else
    {
        Link temp = *head;

    while(temp != NULL)
    {
        printf("%d\n",temp->num);

        temp = temp->next;
    }
    }
}

void insert_tail_link(Link *head,Link *newnode)
{
    if(*head == NULL)
    {
        (*newnode)->next = NULL;
    *head = *newnode;
    }
    else
    {
        Link temp = *head;

    while(temp->next != NULL)
    {
        temp = temp->next;
    }

    temp->next = *newnode;
    (*newnode)->next = NULL;
    }
}

int link_reverse(Link *head)
{

    if(*head == NULL || (*head)->next == NULL)
    {
        printf("error!\n");

    return -1;
    }
    else
    {
        Link ptr;
        Link ktr;
    Link temp;

    ptr = *head;
    ktr = ptr->next;
    temp = ktr->next;

    while(temp != NULL)
    {
        ktr->next = ptr;

        ptr = ktr;
        ktr = temp;
        temp = temp->next;
    }

        ktr->next = ptr;
    (*head)->next = NULL;
    *head = ktr;
    }
}

int main()
{
    int i;
    Link head;
    Link newnode;

    creat_head(&head);

    for(i = 0; i < 10; i++)
    {
        newnode = (Link)malloc(sizeof(Node));

    if(newnode == NULL)
    {
        printf("malloc error!\n");

        exit(1);
    }
        else
    {
        newnode->num = i + 1;

        //insert_head_link(&head,&newnode);
        insert_tail_link(&head,&newnode);
    }
    }

    newnode = (Link)malloc(sizeof(Node));
    newnode->num = 11;

    link_display(&head);
    printf("\n");

    link_reverse(&head);

    link_display(&head);
    printf("\n");
    return 0;
}

头插和尾插(1):

#include <stdio.h>

struct node
{
    int num;

    struct node *next;
};

typedef struct node Node;
typedef Node* Link;

void creat_link(Link *head)
{
    *head = (Link)malloc(sizeof(Node));

    (*head)->next = NULL;
}

void insert_head_link(Link *head,Link *newnode)
{
    (*newnode)->next = (*head)->next;

    (*head)->next = *newnode;
}

void display_head_link(Link *head)
{
    Link temp = (*head)->next;

    while(temp != NULL)
    {
        printf("%d\n",temp->num);

    temp = temp->next;
    }
}

void insert_tail_link(Link *head,Link *newnode)
{
    Link temp = *head;

    while(temp->next != NULL)
    {
        temp = temp->next;
    }

    temp->next = *newnode;
    (*newnode)->next = NULL;
}

void insert_mid_nod(int num,Link *head,Link *newnode)
{
    Link temp = *head;

    while(temp->next !=NULL)
    {
       if(temp->num == num)
       {
           (*newnode)->next = temp->next;
       temp->next = *newnode;
       }

       temp = temp->next;
    }
}

void del_nod(int num,Link *head)
{
    Link temp = *head;
    Link ptr = temp;

    while(temp->next != NULL)
    {
        //temp = temp->next;

    if(temp->num == num)
    {
        ptr->next = temp->next;
    }

    ptr = temp;
    temp = temp->next;
    }
}

int link_reverse(Link *head)
{
    if((*head)->next == NULL || (*head)->next->next == NULL)
    {
        return -1;
    }
    else
    {
        Link ptr = *head;
    Link ktr = ptr->next;
        Link temp = ktr->next;

    while(temp != NULL)
    {
         ktr->next = ptr;

         ptr = ktr;
         ktr = temp;
         temp = temp->next;
    }

        ktr->next = ptr;

    (*head)->next->next = NULL;
    (*head)->next = ktr;
    }

}

int main()
{
    int i;
    Link head;
    Link newnode;

    creat_link(&head);

    for(i = 0; i < 10; i++)
    {
        newnode = (Link)malloc(sizeof(Node));

    if(newnode == NULL)
    {
        printf("malloc erroe!\n");
        exit(1);
    }
    else
    {
        newnode->num = i + 1;

        //insert_head_link(&head,&newnode);
        insert_tail_link(&head,&newnode);
    }
    }

    display_head_link(&head);

    newnode = (Link)malloc(sizeof(Node));
    newnode->num = 11;

    insert_mid_nod(5,&head,&newnode);

    //display_head_link(&head);

    del_nod(5,&head);

    //display_head_link(&head);

    link_reverse(&head);

    display_head_link(&head);
    return 0;
}


头插和尾插(2):

#include <stdio.h>

struct node
{
    int num;

    struct node *next;
};

typedef struct node Node;
typedef Node* Link;

void insert_head_node(Link *head,Link *newnode)
{
    (*newnode)->next = *head;
    *head = *newnode;
}

void insert_tail_node(Link *head,Link *newnode)
{
    if(*head == NULL)
    {
    (*newnode)->next = NULL;
        *head = *newnode;
    }
    else
    {
    Link temp = *head;

    while(temp->next != NULL)
    {
        temp = temp->next;
    }

    temp->next = *newnode;
    (*newnode)->next = NULL;
    }

}

void creat_head(Link *head)
{
    *head = NULL;
}

int link_print(Link *head)
{
    if(*head == NULL)
    {
        return -1;
    }

    Link temp = *head;

    while(temp != NULL)
    {
        printf("%d\n",temp->num);

    temp = temp->next;
    }
}

int insert_mid_node(int num,Link *head,Link *newnode)
{
    if(*head == NULL)
    {
        return -1;
    }
    else
    {
        Link temp = *head;

    while(temp != NULL)
    {
        if(temp->num == num)
        {
            (*newnode)->next = temp->next;
        temp->next = *newnode;
        }

        temp = temp->next;
    }

    return -1;
    }
}

int del_node(int num, Link *head)
{
    if(*head == NULL)
    {
        return -1;
    }

    Link temp = *head;

    if((*head)->num == num)
    {
        *head = (*head)->next;
    }
    else
    {
    Link ptr = temp;
    temp = temp->next;

    while(temp != NULL)
    {

        if(temp->num == num)
        {
            ptr->next = temp->next;
        }

        ptr = temp;
        temp = temp->next;
    }

    return 1;
    }
}

int main()
{
    int i;
    Link head;
    Link newnode;

    creat_head(&head);

    for(i = 0; i < 10; i++)
    {
        newnode = (Link)malloc(sizeof(Node));

    if(newnode == NULL)
    {
        printf("malloc error!\n");
    }
    else
    {
        newnode->num = i + 1;

        //insert_head_node(&head,&newnode);//头叉
        insert_tail_node(&head,&newnode);//尾叉
    }
    }

    newnode = (Link)malloc(sizeof(Node));
    newnode->num = 10;

    del_node(5,&head);//删除节点

    insert_mid_node(5,&head,&newnode);//插入节点

    link_print(&head);//遍历链表

    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值