这次介绍一下线性表的链式存储——单链表
来个关于链式存储的详细图
关于链表的插入和删除的图就不贴出来了,直接上代码
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
LinkList Creat_list()
{
int len;
int n;
printf("please enter the length of the linked list:");
scanf("%d", &len);
LinkList pHead = (LinkList)malloc(sizeof(Node));
if (pHead == NULL)
{
printf("Insufficient memory space!!");
exit(0);
}
pHead->next = NULL;
LinkList pTail = pHead;
for (int i = 0; i < len; i++) //Tail insertion(尾插法)
{
printf("Please enter the data of the node: ");
scanf("%d", &n);
LinkList pNew = (LinkList)malloc(sizeof(Node));
if (pNew == NULL)
{
printf("Insufficient memory space!!");
exit(0);
}
pNew->data = n;
pNew->next = NULL;
pTail->next = pNew;
pTail = pNew;
}
/* for (int i = 0; i < len; i++) //Head insertion(头插法)
{
printf("Please enter the data of the node: ");
scanf("%d", &n);
LinkList pNew = (LinkList)malloc(sizeof(Node));
pNew->data = n;
pNew->next = pHead->next;
pHead->next = pNew;
}*/
return pHead;
}
void traverse(LinkList pHead)
{
LinkList p = pHead->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void insert_list(LinkList &pHead)
{
LinkList p = pHead;
int index, num;
printf("Please enter the location to insert: ");
scanf("%d", &index);
int i = 0;
while (NULL != p && i < index - 1)
{
i++;
p = p->next;
}
if ( p == NULL || i > index - 1)
{
printf("The enter location is illegal!!\n");
return;
}
printf("Please enter the value to insert: ");
scanf("%d", &num);
LinkList pNew = (LinkList)malloc(sizeof(Node));
if (pNew == NULL)
{
printf("Insufficient memory space!!");
return;
}
pNew->data = num;
pNew->next = p->next;
p->next = pNew;
}
void delete_list(LinkList &pHead, int &e)
{
int pos;
printf("Please enter the location to delete :");
scanf("%d", &pos);
LinkList p = pHead;
int i = 0;
while (p->next != NULL && i < pos - 1)
{
p = p->next;
i++;
}
if (p->next == NULL || i > pos - 1)
{
printf("The enter location is illegal!!\n");
return;
}
LinkList tmp = p->next;
e = tmp->data;
p->next = tmp->next;
free(tmp);
tmp = NULL;
}
int length_list(LinkList pHead)
{
int len = 0;
LinkList p = pHead->next;
while (p != NULL)
{
len++;
p = p->next;
}
return len;
}
bool clear_list(LinkList *pHead)
{
LinkList p, q;
p = (*pHead)->next;
while (p != NULL)
{
q = p->next;
free(p);
p = q;
}
(*pHead)->next = NULL;
return true;
}
int main()
{
LinkList pHead = Creat_list(); //Creat a single linked list
traverse(pHead); //Traversing a single linked list
insert_list(pHead); //Insert element in the single linked list (在单链表中插入元素)
traverse(pHead);
int e;
delete_list(pHead, e); //Delete a node of the single linked list
printf("The value of the deleted node is: %d\n", e);
traverse(pHead);
int len = length_list(pHead); //Get the length of the single linked list
printf("The length of the single linked list is %d\n", len);
if (clear_list(&pHead)) //Start emptying the single linked list
{
printf("Single linked list has been emptied!!\n");
}
return 0;
}
单链表结构与顺序存储结构优缺点
存储分配方式 | 时间性能 | 空间性能 |
---|---|---|
1. 顺序存储结构使用的一段连续的存储空间 | 查找:顺序存储O(1);链式存储O(n) | 顺序存储需要先分配好存储空间,分大会浪费,分小易发生溢出 |
2. 单链表则是运用任意一组存储单元来存储元素 | 插入和删除:顺序存储移动表长的一大半O(n) ; 链式存储O(1) | 单链表是随时用随时分配 |
-
若线性表需要频繁地查找,很少进行插入和删除操作时,宜采用顺序存储结构;若线性表需要频繁地进行插入和删除操作时,宜采用单链表存储结构;
-
如果线性表中的元素个数变化比较大或者是未知时,最好用单链表结构;如果线性表的大致长度已知,则顺序存储的效率会更高。
是运用任意一组存储单元来存储元素 | 插入和删除:顺序存储移动表长的一大半O(n) ; 链式存储O(1) | 单链表是随时用随时分配| -
若线性表需要频繁地查找,很少进行插入和删除操作时,宜采用顺序存储结构;若线性表需要频繁地进行插入和删除操作时,宜采用单链表存储结构;
-
如果线性表中的元素个数变化比较大或者是未知时,最好用单链表结构;如果线性表的大致长度已知,则顺序存储的效率会更高。