📜  数据结构-单链表

📅  最后修改于: 2020-10-15 00:43:33             🧑  作者: Mango

链表

  • 链接列表可以定义为随机存储在内存中的称为节点的对象的集合。
  • 一个节点包含两个字段,即存储在该特定地址的数据和包含存储器中下一个节点的地址的指针。
  • 列表的最后一个节点包含指向null的指针。

链表的用途

  • 该列表不需要连续存在于内存中。该节点可以驻留在内存中的任何位置,并链接在一起以创建一个列表。这实现了空间的优化利用。
  • 列表大小受内存大小限制,不需要事先声明。
  • 空节点不能出现在链接列表中。
  • 我们可以将原始类型或对象的值存储在单链表中。

为什么在数组上使用链表?

到目前为止,我们一直在使用数组数据结构来组织要单独存储在内存中的元素组。但是,Array具有许多优点和缺点,必须知道这些优点和缺点才能决定将在整个程序中使用的数据结构。

数组包含以下限制:

  • 在程序中使用数组之前,必须事先知道数组的大小。
  • 增大阵列的大小是一个耗时的过程。在运行时几乎不可能扩展阵列的大小。
  • 数组中的所有元素都需要连续存储在内存中。在数组中插入任何元素都需要移动其所有前任元素。

链表是可以克服数组所有限制的数据结构。使用链表非常有用,因为,

  • 它动态分配内存。链表的所有节点不连续地存储在内存中,并在指针的帮助下链接在一起。
  • 调整大小不再是问题,因为在声明时我们不需要定义其大小。列表根据程序的需求而增长,并受限于可用内存空间。

单链表或单向链

单链列表可以定义为元素的有序集合的集合。元素的数量可以根据程序的需要而变化。单链列表中的节点由两部分组成:数据部分和链接部分。节点的数据部分存储将由该节点表示的实际信息,而节点的链接部分存储其直接后继者的地址。

单向链表或单链表只能在一个方向上遍历。换句话说,我们可以说每个节点仅包含下一个指针,因此我们不能以相反的方向遍历列表。

考虑一个示例,该示例将学生在三个主题中获得的分数存储在一个链接列表中,如图所示。

在上图中,箭头表示链接。每个节点的数据部分包含学生在不同学科中获得的分数。列表中的最后一个节点由存在于最后一个节点的地址部分中的空指针标识。在列表的数据部分中,我们可以具有所需的任意多个元素。

复杂

Data Structure Time Complexity Space Compleity
Average Worst Worst
Access Search Insertion Deletion Access Search Insertion Deletion
Singly Linked List θ(n) θ(n) θ(1) θ(1) O(n) O(n) O(1) O(1) O(n)

单链表上的操作

可以对单链表执行各种操作。下面列出了所有此类操作。

节点创建

            struct node 
            {
                int data; 
                struct node *next;
            };
            struct node *head, *ptr; 
            ptr = (struct node *)malloc(sizeof(struct node *));
            

插入

可以在不同位置执行插入到单链接列表的操作。根据要插入的新节点的位置,将插入分为以下类别。

SN Operation Description
1 Insertion at beginning It involves inserting any element at the front of the list. We just need to a few link adjustments to make the new node as the head of the list.
2 Insertion at end of the list It involves insertion at the last of the linked list. The new node can be inserted as the only node in the list or it can be inserted as the last one. Different logics are implemented in each scenario.
3 Insertion after specified node It involves insertion after the specified node of the linked list. We need to skip the desired number of nodes in order to reach the node after which the new node will be inserted. .

删除和遍历

从单个链接列表中删除节点可以在不同位置执行。根据要删除的节点的位置,将操作分类为以下类别。

SN Operation Description
1 Deletion at beginning It involves deletion of a node from the beginning of the list. This is the simplest operation among all. It just need a few adjustments in the node pointers.
2 Deletion at the end of the list It involves deleting the last node of the list. The list can either be empty or full. Different logic is implemented for the different scenarios.
3 Deletion after specified node It involves deleting the node after the specified node in the list. we need to skip the desired number of nodes to reach the node after which the node will be deleted. This requires traversing through the list.
4 Traversing In traversing, we simply visit each node of the list at least once in order to perform some specific operation on it, for example, printing data part of each node present in the list.
5 Searching In searching, we match each element of the list with the given element. If the element is found on any of the location then location of that element is returned otherwise null is returned. .

C:菜单驱动程序中的链接列表

#include
#include
struct node 
{
    int data;
    struct node *next; 
};
struct node *head;

void beginsert (); 
void lastinsert ();
void randominsert();
void begin_delete();
void last_delete();
void random_delete();
void display();
void search();
void main ()
{
    int choice =0;
    while(choice != 9) 
    {
        printf("\n\n*********Main Menu*********\n");
        printf("\nChoose one option from the following list ...\n");
        printf("\n===============================================\n");
        printf("\n1.Insert in begining\n2.Insert at last\n3.Insert at any random location\n4.Delete from Beginning\n
        5.Delete from last\n6.Delete node after specified location\n7.Search for an element\n8.Show\n9.Exit\n");
        printf("\nEnter your choice?\n");        
        scanf("\n%d",&choice);
        switch(choice)
        {
            case 1:
            beginsert();    
            break;
            case 2:
            lastinsert();        
            break;
            case 3:
            randominsert();        
            break;
            case 4:
            begin_delete();        
            break;
            case 5:
            last_delete();        
            break;
            case 6:
            random_delete();        
            break;
            case 7:
            search();        
            break;
            case 8:
            display();        
            break;
            case 9:
            exit(0);
            break;
            default:
            printf("Please enter valid choice..");
        }
    }
}
void beginsert()
{
    struct node *ptr;
    int item;
    ptr = (struct node *) malloc(sizeof(struct node *));
    if(ptr == NULL)
    {
        printf("\nOVERFLOW");
    }
    else
    {
        printf("\nEnter value\n");    
        scanf("%d",&item);    
        ptr->data = item;
        ptr->next = head;
        head = ptr;
        printf("\nNode inserted");
    }
    
}
void lastinsert()
{
    struct node *ptr,*temp;
    int item;    
    ptr = (struct node*)malloc(sizeof(struct node));    
    if(ptr == NULL)
    {
        printf("\nOVERFLOW");    
    }
    else
    {
        printf("\nEnter value?\n");
        scanf("%d",&item);
        ptr->data = item;
        if(head == NULL)
        {
            ptr -> next = NULL;
            head = ptr;
            printf("\nNode inserted");
        }
        else
        {
            temp = head;
            while (temp -> next != NULL)
            {
                temp = temp -> next;
            }
            temp->next = ptr;
            ptr->next = NULL;
            printf("\nNode inserted");
        
        }
    }
}
void randominsert()
{
    int i,loc,item; 
    struct node *ptr, *temp;
    ptr = (struct node *) malloc (sizeof(struct node));
    if(ptr == NULL)
    {
        printf("\nOVERFLOW");
    }
    else
    {
        printf("\nEnter element value");
        scanf("%d",&item);
        ptr->data = item;
        printf("\nEnter the location after which you want to insert ");
        scanf("\n%d",&loc);
        temp=head;
        for(i=0;inext;
            if(temp == NULL)
            {
                printf("\ncan't insert\n");
                return;
            }
        
        }
        ptr ->next = temp ->next; 
        temp ->next = ptr; 
        printf("\nNode inserted");
    }
}
void begin_delete()
{
    struct node *ptr;
    if(head == NULL)
    {
        printf("\nList is empty\n");
    }
    else 
    {
        ptr = head;
        head = ptr->next;
        free(ptr);
        printf("\nNode deleted from the begining ...\n");
    }
}
void last_delete()
{
    struct node *ptr,*ptr1;
    if(head == NULL)
    {
        printf("\nlist is empty");
    }
    else if(head -> next == NULL)
    {
        head = NULL;
        free(head);
        printf("\nOnly node of the list deleted ...\n");
    }
        
    else
    {
        ptr = head; 
        while(ptr->next != NULL)
        {
            ptr1 = ptr;
            ptr = ptr ->next;
        }
        ptr1->next = NULL;
        free(ptr);
        printf("\nDeleted Node from the last ...\n");
    }    
}
void random_delete()
{
    struct node *ptr,*ptr1;
    int loc,i;    
    printf("\n Enter the location of the node after which you want to perform deletion \n");
    scanf("%d",&loc);
    ptr=head;
    for(i=0;inext;
            
        if(ptr == NULL)
        {
            printf("\nCan't delete");
            return;
        }
    }
    ptr1 ->next = ptr ->next;
    free(ptr);
    printf("\nDeleted node %d ",loc+1);
}
void search()
{
    struct node *ptr;
    int item,i=0,flag;
    ptr = head; 
    if(ptr == NULL)
    {
        printf("\nEmpty List\n");
    }
    else
    { 
        printf("\nEnter item which you want to search?\n"); 
        scanf("%d",&item);
        while (ptr!=NULL)
        {
            if(ptr->data == item)
            {
                printf("item found at location %d ",i+1);
                flag=0;
            } 
            else
            {
                flag=1;
            }
            i++;
            ptr = ptr -> next;
        }
        if(flag==1)
        {
            printf("Item not found\n");
        }
    }    
        
}

void display()
{
    struct node *ptr;
    ptr = head; 
    if(ptr == NULL)
    {
        printf("Nothing to print");
    }
    else
    {
        printf("\nprinting values . . . . .\n"); 
        while (ptr!=NULL)
        {
            printf("\n%d",ptr->data);
            ptr = ptr -> next;
        }
    }
}    
            

输出:

            *********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
1

Enter value
1

Node inserted

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
2

Enter value?
2

Node inserted

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
3

Enter element value1

Enter the location after which you want to insert 1

Node inserted

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
8

printing values . . . . .

1
2
1

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
2

Enter value?
123

Node inserted

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
1

Enter value
1234

Node inserted

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
4

Node deleted from the begining ...

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
5

Deleted Node from the last ...

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
6

Enter the location of the node after which you want to perform deletion 
1

Deleted node 2 

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
8

printing values . . . . .

1
1

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
7

Enter item which you want to search?
1
item found at location 1 
item found at location 2 

*********Main Menu*********

Choose one option from the following list ...

===============================================

1.Insert in begining
2.Insert at last
3.Insert at any random location
4.Delete from Beginning
5.Delete from last
6.Delete node after specified location
7.Search for an element
8.Show
9.Exit

Enter your choice?
9