链表结构回顾

来源:互联网 发布:数据采集卡ni 编辑:程序博客网 时间:2024/05/16 05:59

1.不带表头的单向链表。

#include<stdio.h>

struct node

{

    int num;

    struct node *next;

};

 

    typedef struct node Node;

    typedef Node * Link;

 

void init_link(Link *head)

{

    *head = NULL;

}

 

void insert_head_node(Link newnode, Link *head)

{

    newnode->next = *head;

    *head = newnode;

}

 

int display_link(Link head)

{

    if(head == NULL)

    {

        return -1;

    }

 

    Link temp = head;

    while(temp != NULL)

 

    {

        printf("%d\n",temp->num);

temp = temp->next;

    }

 

}

 

int insert_middle_node(Link newnode, Link head, int num)

{

    if(head == NULL)

    {

        return -1;

    }

 

    Link temp = head;

 

    while(temp != NULL)

    {

        if(temp->num == num)

{

    newnode->next = temp->next;

    temp->next = newnode;

    return 0;

}

temp = temp->next;

    }

    return -1;

}

 

#if 0

int delete_node(Link newnode, Link *head, int num)

{

    if(*head == NULL)

    {

        return -1;

    }

 

    Link temp =*head;

 

    if((*head)->num == num)

    {

        *head = (*head)->next;

free(temp);

return 0;

    }

 

    Link ptr = temp;

    temp = temp->next;

 

    while(temp != NULL)

    {

        if(temp->num == num)

{

    ptr->next = temp->next;

    free(temp);

    temp = NULL;

    return 0;

}

ptr = temp;

        temp = temp->next;

 

    }

    return -1;

}

#endif

 

int delete_node(Link newnode,Link *head,int num)

{

    if(*head == NULL)

    {

        return -1;

    }

 

    Link temp = *head;

 

    if((*head)->num == num)

    {

        *head = (*head)->next;

        free(temp);

return 0;

    }

 

    Link ptr = temp;

    temp = temp->next;

 

    while(temp != NULL)

    {

        if(temp->num == num)

{

    ptr->next = temp->next;

    free(temp);

            temp = NULL;

    return 0;

}

        ptr = temp;

temp = temp->next;

       

    }

    return -1;

}

 

int reverse_link(Link *head)

{

    if((*head) == NULL || (*head)->next == NULL)

    {

        return -1;

    }

 

    Link str = *head;

    Link ptr = str->next;

    Link temp = ptr->next;

 

    while(temp != NULL)

    {

        ptr->next = str;

        str  = ptr;

        ptr = temp;    

        temp = temp->next;

    }

        

    ptr->next = str;

    (*head)->next =NULL;

    *head = ptr ;

    return -1;

}

 

int insert_tail_node(Link newnode, Link *head)

{

    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 main()

{

    Link head;

    Link newnode;

    init_link(&head);

 

    int i;

    for(i = 0; i < 10; i++)

    {

        newnode = (Link)malloc(sizeof(Node));

newnode->num = i + 1;

        //insert_head_node(newnode,&head);

        insert_tail_node(newnode,&head);

    }

    display_link(head);

 

    newnode = (Link)malloc(sizeof(Node));

    newnode->num = 11;

 

    insert_middle_node(newnode,head,6);

    printf("middle node:\n");

    display_link(head);

 

    delete_node(newnode,&head,3);

    printf("delete node:\n");

    display_link(head);

 

    reverse_link(&head);

    printf("reverse node:\n");

    display_link(head);

 

    return 0;

}

 

2.带表头的链表

#include<stdio.h>

struct node

{

    int num;

    struct node *next;

};

 

    typedef struct node Node;

    typedef Node * Link;

 

void init_link(Link *head)

{

    *head = (Link)malloc(sizeof(Node));

    (*head)->next = NULL;

}

 

void insert_head_node(Link newnode, Link *head)

{

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

    (*head)->next = newnode;

}

 

int display_link(Link head)

{

    Link temp = head->next;

    while(temp != NULL)

 

    {

        printf("%d\n",temp->num);

temp = temp->next;

    }

 

}

 

int insert_middle_node(Link newnode, Link head, int num)

{

    Link temp = head;

 

    while(temp != NULL)

    {

        if(temp->num == num)

{

    newnode->next = temp->next;

    temp->next = newnode;

    return 0;

}

temp = temp->next;

    }

    return -1;

}

 

int delete_node(Link newnode,Link *head,int num)

{

    if((*head)->next == NULL)

    {

        return -1;

    }

 

    Link temp = *head;

 

    

 

    Link ptr = temp;

    temp = temp->next;

 

    while(temp != NULL)

    {

        if(temp->num == num)

{

    ptr->next = temp->next;

    free(temp);

            temp = NULL;

    return 0;

}

        ptr = temp;

temp = temp->next;

       

    }

    return -1;

}

 

int reverse_link(Link *head)

{

    if((*head)->next == NULL || ((*head)->next->next) == NULL)

    {

        return -1;

    }

 

    Link str = *head;

    Link ptr = str->next;

    Link temp = ptr->next;

 

    while(temp != NULL)

    {

        ptr->next = str;

        str  = ptr;

        ptr = temp;    

        temp = temp->next;

    }

        

    ptr->next = str;

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

    (*head)->next = ptr ;

 

    return -1;

}

 

 

int insert_tail_node(Link newnode, Link *head)

{

    if((*head)->next ==  NULL)

    {

        newnode->next = NULL;

(*head)->next = newnode;

    }

    

    else

    {

        Link temp = *head;

        while(temp->next != NULL)

    {

        temp = temp->next;

    }

        temp->next = newnode;

newnode->next = NULL;

    }

}

 

 

int main()

{

    Link head;

    Link newnode;

    init_link(&head);

 

    int i;

    for(i = 0; i < 10; i++)

    {

        newnode = (Link)malloc(sizeof(Node));

newnode->num = i + 1;

        //insert_head_node(newnode,&head);

        insert_tail_node(newnode,&head);

    }

    display_link(head);

 

    newnode = (Link)malloc(sizeof(Node));

    newnode->num = 11;

 

    insert_middle_node(newnode,head,6);

    printf("middle node:\n");

    display_link(head);

 

    delete_node(newnode,&head,3);

    printf("delete node:\n");

    display_link(head);

 

    reverse_link(&head);

    printf("reverse node:\n");

    display_link(head);

 

    return 0;

}

 

3.带表头的循环链表

#include<stdio.h>

struct node

{

    int num;

    struct node *next;

};

 

    typedef struct node Node;

    typedef Node * Link;

 

void init_link(Link *head)

{

    *head = (Link)malloc(sizeof(Node));

    (*head)->next = *head;

}

 

void insert_head_node(Link newnode, Link *head)

{

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

    (*head)->next = newnode;

}

 

int display_link(Link head)

{

    Link temp = head->next;

 

    while(temp != head)

 

    {

        printf("%d\n",temp->num);

temp = temp->next;

    }

 

}

 

int insert_middle_node(Link newnode, Link *head, int num)

{

    Link temp = *head;

 

    while(temp->next != *head)

    {

        if(temp->num == num)

{

    printf("a\n");

    newnode->next = temp->next;

    temp->next = newnode;

    return 0;

}

temp = temp->next;

    }

    return -1;

}

 

int delete_node(Link newnode,Link *head,int num)

{

    if((*head)->next == *head)

    {

        return -1;

    }

 

    Link temp = *head;

 

    

 

    Link ptr = temp;

    temp = temp->next;

 

    while(temp->next != *head)

    {

        if(temp->num == num)

{

    ptr->next = temp->next;

    free(temp);

            temp = NULL;

    return 0;

}

        ptr = temp;

temp = temp->next;

       

    }

    return -1;

}

 

int reverse_link(Link *head)

{

    if((*head)->next == *head || ((*head)->next->next) == *head)

    {

        return -1;

    }

 

    Link str = *head;

    Link ptr = str->next;

    Link temp = ptr->next;

 

    while(temp != *head)

    {

        ptr->next = str;

        str  = ptr;

        ptr = temp;    

        temp = temp->next;

    }

        

    ptr->next = str;

    temp = (*head)->next;

    (*head)->next = ptr;

    temp->next = *head ;

 

    return -1;

}

 

 

void insert_tail_node(Link newnode, Link *head)

{

    

        Link temp = *head;

 

        while(temp->next != *head)

    {

        temp = temp->next;

    }

        temp->next = newnode;

newnode->next = *head;

    }

 

 

 

int main()

{

    Link head;

    Link newnode;

    init_link(&head);

 

    int i;

    for(i = 0; i < 10; i++)

    {

        newnode = (Link)malloc(sizeof(Node));

newnode->num = i + 1;

        insert_head_node(newnode,&head);

        //insert_tail_node(newnode,&head);

    }

    display_link(head);

 

    newnode = (Link)malloc(sizeof(Node));

    newnode->num = 11;

 

    insert_middle_node(newnode,&head,6);

    printf("middle node:\n");

    display_link(head);

 

    delete_node(newnode,&head,3);

    printf("delete node:\n");

    display_link(head);

 

    reverse_link(&head);

    printf("reverse node:\n");

    display_link(head);

 

    return 0;

}

 

4.双向循环链表

#include <stdio.h>

 

struct node

{

    int num;

 

    struct node *prior;

    struct node *next;

};

 

typedef struct node Node;

typedef Node * Dlink;

 

void init_d_link(Dlink *head)

{

    *head = (Dlink)malloc(sizeof(Node));

 

    (*head)->prior = *head;

    (*head)->next = *head;

}

 

void insert_head_node(Dlink newnode,Dlink head)

{

    newnode->next = head->next;

    head->next->prior = newnode;

 

    head->next = newnode;

    newnode->prior = head;

}

 

void insert_tail_node(Dlink newnode, Dlink head)

{

    head->prior->next = newnode;

    newnode->prior = head->prior;

 

    newnode->next = head;

    head->prior = newnode;

}

 

 

int insert_mid_node(Dlink newnode, Dlink head,int num)

{

    Dlink temp = head->next;

 

    while(temp != head)

    {

        if(temp->num == num)

{

    newnode->next = temp->next;

    temp->next->prior = newnode;

 

    temp->next = newnode;

    newnode->prior = temp;

 

    return 0;

}

 

temp = temp->next;

    }

 

    return -1;

}

 

int delete_node(int num, Dlink head)

{

    Dlink temp = head->next;

 

    while(temp != head)

    {

        if(temp->num == num)

{

            temp->prior->next = temp->next;

    temp->next->prior = temp->prior;

    free(temp);

    temp = NULL;

    return 0;

}

 

temp = temp->next;

    }

 

    return -1;

}

 

void display_link(Dlink head)

{

    Dlink temp = head->next;

 

 

    while(temp != head)

    {

        printf("%d\n",temp->num);

 

temp = temp->next;

    }

}

 

 

int main()

{

    Dlink head;

    Dlink newnode;

 

    init_d_link(&head);

 

    int i;

 

    for(i = 0; i < 10; i++)

    {

        newnode = (Dlink)malloc(sizeof(Node));

 

newnode->num = i + 1;

 

//insert_head_node(newnode,head);

        insert_tail_node(newnode,head);

    }

 

    display_link(head);

    

    newnode = (Dlink)malloc(sizeof(Node));

    newnode->num = 11;

 

    insert_mid_node(newnode,head,5);

 

    display_link(head);

    

    delete_node(7,head);

    

    display_link(head);

 

    return 0;

}

 

 

0 0
原创粉丝点击