您的位置:首页 > 编程语言 > C语言/C++

C语言实现链表

2013-03-23 12:04 447 查看
用C语言实现了链表。基本操作有:

创建:

前插法

后插法

查找:

按地址查找

按数值查找

插入:

按地址插入

按数值插入

删除:

按地址删除

按数值删除

输出

以下是程序内容:

/************************************************************
 * List.c                                                   *
 * To create a simple list and some functions.              *
 * by Eric Brown.                                           *
 ************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>        /*C99 only*/

typedef struct List
{
    int data;
    struct List *next;
}node;

/*create_prev_insert: to create a list by inserting node before current node.*/
node * create_prev_insert(void);
/*print_list: to print a list.*/
void print_list(node *list);
/*create_next_insert: to create a list by inserting node next current node.*/
node * create_next_insert(void);
/*find_by_add: to find a node by its address.*/
node * find_by_add(node *list, int add);
/*find_by_data: to find a node by its data.*/
node * find_by_data(node *list, int data);
/*insert_by_add: to insert a node by address.*/
bool insert_by_add(node **list, int data, int add);
/*insert_by_data: to insert a node by data.*/
bool insert_by_data(node **list, int node_data, int list_data);
/*delete_by_add: to delete a node by address.*/
bool delete_by_add(node **list, int add);
/*delete_by_data: to delete a node by data.*/
bool delete_by_data(node **list, int data);

int main(void)
{
    int data, op, add, list_data;
    node *list, *temp;
    list = NULL;
    
    for (;;)
    {
        printf("--------------------------Menu--------------------------\n");
        printf("| 1.Create a list with create_prev_insert function.    |\n");
        printf("| 2.Create a list with create_next_insert function.    |\n");
        printf("| 3.Find a member by its address.                      |\n");
        printf("| 4.Find a member by its data.                         |\n");
        printf("| 5.Insert a member by address.                        |\n");
        printf("| 6.Insert a member by data.                           |\n");
        printf("| 7.Delete a member by its address.                    |\n");
        printf("| 8.Delete a member by its data.                       |\n");
        printf("| 9.Print the list.                                    |\n");
        printf("| 0.Exit.                                              |\n");
        printf("--------------------------------------------------------\n");
        printf("| Your selection:");
        scanf("%d", &op);
        fflush(stdin);
        
        switch (op)
        {
            case 1:
                list = create_prev_insert();
                break;
            case 2:
                list = create_next_insert();
                break;
            case 3:
                printf("| Please input address:");
                scanf("%d", &add);
                temp = find_by_add(list, add);
                if (temp == NULL)
                    printf("| Can't find this node!\n");
                else
                    printf("| The node is %d\n", temp->data);
                printf("--------------------------------------------------------\n\n");
                break;
            case 4:
                printf("| Please input the data:");
                scanf("%d", &data);
                temp = find_by_data(list, data);
                if (temp == NULL)
                    printf("| Can't find this node!\n");
                else
                    printf("| The node is %d\n", temp->data);
                printf("--------------------------------------------------------\n\n");
                break;
            case 5:
                printf("| Please input the data:");
                scanf("%d", &data);
                printf("| Please input the address:");
                scanf("%d", &add);
                insert_by_add(&list, data, add);
                break;
            case 6:
                printf("| Please input the node_data:");
                scanf("%d", &data);
                printf("| Please input the list_data:");
                scanf("%d", &list_data);
                insert_by_data(&list, data, list_data);
                break;
            case 7:
                printf("| Please input the address:");
                scanf("%d", &add);
                delete_by_add(&list, add);
                break;
            case 8:
                printf("| Please input the data:");
                scanf("%d", &data);
                delete_by_data(&list, data);
                break;
            case 9:
                print_list(list);
                break;
            case 0:
                exit(EXIT_SUCCESS);
            default :
                printf("--------------------------------------------------------\n");
                printf("| No this operation!                                   |\n");
                printf("--------------------------------------------------------\n\n");
        }
    }
}

node * create_prev_insert(void)
{
    node *head, *new_node;
    head = NULL;
    int n, data;
    
    printf("| Please input the number of nodes you \n");
    printf("| want to create:");
    scanf("%d", &n);
    if (n <= 0)
    {
        printf("Can't create a list with length less than 0!\n\n");
        exit(EXIT_FAILURE);
    }
    
    while (n--)
    {
        new_node = (node *)malloc(sizeof(node));
        if (new_node == NULL)
        {
            printf("Can't create the list!\n\n");
            exit(EXIT_FAILURE);
        }
        scanf("%d", &data);
        new_node->data = data;
        new_node->next = head;
        head = new_node;
    }
    
    return head;
}

void print_list(node *list)
{
    int i = 0;
    
    if (list == NULL)
    {
        printf("| The list hasn't been initialized!\n");
        printf("--------------------------------------------------------\n\n");
        return ;
    }
    printf("--------------------------------------------------------\n");
    printf("| ");
    for (; list != NULL; list = list->next)
    {
        printf("%d\t", list->data);
        if (++i % 5 == 0)
            printf("\n| ");
    }
    printf("\n");
    printf("--------------------------------------------------------\n\n");
    
}

node * create_next_insert(void)
{
    node *head, *cur, *next;
    int n, data;
    
    printf("| Please input the number of nodes you \n");
    printf("| want to create:");
    scanf("%d", &n);
    if (n <= 0)
    {
        printf("Can't create a list with length less than 0!\n\n");
        exit(EXIT_FAILURE);
    }
    head = (node *)malloc(sizeof(node));
    if (head == NULL)
    {
        printf("Can't create the list!\n\n");
        exit(EXIT_FAILURE);
    }
    cur = head;
    scanf("%d", &data);
    cur->data = data;
    while (--n)
    {
        next = (node *)malloc(sizeof(node));
        if (next == NULL)
        {
            printf("Can't create a list with length less than 0!\n\n");
            exit(EXIT_FAILURE);
        }
        scanf("%d", &data);
        next->data = data;
        cur->next = next;
        cur = next;
    }
    cur->next = NULL;
    
    return head;
}

node * find_by_add(node *list, int add)
{
    if (list == NULL)
    {
        printf("| The list hasn't been initialized!\n");
        printf("--------------------------------------------------------\n\n");
        return 0;
    }
    if (add <= 0)
    {
        printf("Error address!\n\n");
        exit(EXIT_FAILURE);
    }
    for (; --add > 0 && list != NULL; list = list->next)
        ;
        
    return list;
}

node * find_by_data(node *list, int data)
{
    if (list == NULL)
    {
        printf("| The list hasn't been initialized!\n");
        printf("--------------------------------------------------------\n\n");
        return 0;
    }
    for (;list != NULL && list->data != data; list = list->next)
        ;
    
    return list;
}

bool insert_by_add(node **list, int data, int add)
{
    node *new_node, *cur;
    
    if (*list == NULL)
    {
        printf("| The list hasn't been initialized!\n");
        printf("--------------------------------------------------------\n\n");
        return false;
    }
    if (add <= 0)
    {
        printf("| Error address!\n");
        printf("--------------------------------------------------------\n\n");
        return false;
    }
    else if (add == 1)
    {
        cur = *list;
    }
    else
        cur = find_by_add(*list, add - 1);
    if (cur == NULL)
    {
        printf("Can't find this node!\n");
        printf("--------------------------------------------------------\n\n");
        return false;
    }
    new_node = (node *)malloc(sizeof(node));
    if (new_node == NULL)
    {
        printf("| Can't create the list!\n\n");
        exit(EXIT_FAILURE);
    }
    new_node->data = data;
    if (cur == *list)
    {
        new_node->next = *list;
        *list = new_node;
    }
    else
    {
        new_node->next = cur->next;
        cur->next = new_node;
    }
    
    return true;
}

bool insert_by_data(node **list, int node_data, int list_data)
{
    node *new_node, *cur, *prev;
    
    if (*list == NULL)
    {
        printf("| The list hasn't been initialized!\n");
        printf("--------------------------------------------------------\n\n");
        return false;
    }
    for (prev = NULL, cur = *list;
         cur != NULL && cur->data != list_data;
         prev = cur, cur = cur->next)
        ;
    if (cur == NULL)
    {
        printf("| Can't find the node!\n");
        printf("--------------------------------------------------------\n\n");
        return false;
    }
    new_node = (node *)malloc(sizeof(node));
    if (new_node == NULL)
    {
        printf("Can't create this list!\n\n");
        exit(EXIT_FAILURE);
    }
    new_node->data = node_data;
    if (prev == NULL)
    {
        new_node->next = *list;
        *list = new_node;
    }
    else
    {
        new_node->next = cur;
        prev->next = new_node;
    }
    
    return true;
}

bool delete_by_add(node **list, int add)
{
    node *cur, *prev;
    
    if (*list == NULL)
    {
        printf("| The list hasn't been initialized!\n");
        printf("--------------------------------------------------------\n\n");
        return false;
    }
    if (add <= 0)
    {
        printf("| Error address!\n");
        printf("--------------------------------------------------------\n\n");
        return false;
    }
    else if (add == 1)
    {
        cur = *list;
        *list = (*list)->next;
        free(cur);
    }
    else
    {
        prev = find_by_add(*list, add - 1);
        if (prev == NULL)
        {
            printf("| Can't find the node!\n");
            printf("--------------------------------------------------------\n\n");
            return false;
        }
        cur = prev->next;
        prev->next = cur->next;
        free(cur);
    }
    
    return true;
}
    
bool delete_by_data(node **list, int data)
{
    node *cur, *prev;
    
    if (*list == NULL)
    {
        printf("| The list hasn't been initialized!\n");
        printf("--------------------------------------------------------\n\n");
        return false;
    }
    for (prev = NULL, cur = *list;
         cur != NULL && cur->data != data;
         prev = cur, cur = cur->next)
        ;
    if (cur == NULL)
    {
        printf("| Can't find the node!\n");
        printf("--------------------------------------------------------\n\n");
        return false;
    }
    if (prev == NULL)
    {
        *list = (*list)->next;
        free(cur);
    }
    else 
    {
        prev->next = cur->next;
        free(cur);
    }
    
    return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: