1.相对于顺序表的线性存储,顺序表的链式存储(单链表为例)最突出的优点:
对元素的插入与删除非常快;
顺序表的线性存储插入和删除需要移动大量的元素,操作速度缓慢;而获取元素的速度相对而言比较快;
单链表刚好和他相反,插入和删除很快,获取元素速度比不上线性表;
2.单链表的形式:
3.单链表的插入和删除:
4.除了插入和删除的其他操作:
创建单链表、销毁单链表、清空单链表、获取单链表长度等等;
5.代码实现:
LinkList.h实现代码:
#include <stdio.h>
#include <malloc.h>
#include "LinkList.h"
typedef struct _tag_LinkList
{
LinkListNode header;
int length;
}TLinkList; //定义链表头结点,注意header 变量一定要放在length之前
LinkList * LinkList_Create()
{
TLinkList * ret = NULL;
ret = (TLinkList *)malloc(sizeof(TLinkList));
if(ret)
{
ret->header.next = NULL;
ret->length = 0;
}
return ret;
}
void LinkList_Destory(LinkList * list)
{
free(list);
return ;
}
void LinkList_Clear(LinkList * list)
{
TLinkList * tlist = (TLinkList *)list;
if(tlist)
{
tlist->header.next = NULL;
tlist->length = 0;
}
return ;
}
int LinkList_Length(LinkList * list)
{
int ret = -1;
TLinkList * tlist = (TLinkList *)list;
if(tlist)
{
ret = tlist->length;
}
return ret;
}
int LinkList_Insert(LinkList * list, LinkListNode * node, int pos)
{
int i = 0;
TLinkList * tlist = (TLinkList *)list;
int ret = (tlist != NULL) && (0 <= pos) && (node != NULL);//加上 (pos < tlist->length) 会出错!!!!!!
LinkListNode * current = (LinkListNode *)tlist;
if(ret)
{
for(i=0; (i<pos)&&(current->next != NULL); i++)
{
current = current->next;
}
node->next = current->next;
current->next = node;
tlist->length++;
}
return ret;
}
LinkListNode * LinkList_Get(LinkList * list, int pos)
{
int i = 0;
LinkListNode * ret = NULL;
TLinkList * tlist = (TLinkList *)list;
LinkListNode * current = (LinkListNode *)tlist;
if((tlist != NULL) && (0 <= pos) && (pos <tlist->length))
{
for(i=0; (i<pos)&&(current->next != NULL); i++)
{
current = current->next;
}
ret = current->next;
}
return ret;
}
LinkListNode * LinkList_Delete(LinkList * list, int pos)
{
int i = 0;
LinkListNode * ret = NULL;
TLinkList * tlist = (TLinkList *)list;
LinkListNode * current = (LinkListNode *)tlist;
if((tlist != NULL) && (0 <= pos) && (pos <tlist->length))
{
for(i=0; (i<pos)&&(current->next != NULL); i++)
{
current = current->next;
}
ret = current->next;
current->next = ret->next;
tlist->length--;
}
return ret;
}
LinkList.h实现代码:
#ifndef _LINKLIST_H
#define _LINKLIST_H
typedef void LinkList;
typedef struct _tag_LinkListNode LinkListNode;
struct _tag_LinkListNode
{
LinkListNode * next;
};
LinkList * LinkList_Create();
void LinkList_Destory(LinkList * list);
void LinkList_Clear(LinkList * list);
int LinkList_Length(LinkList * list);
int LinkList_Insert(LinkList * list, LinkListNode * node, int pos);
LinkListNode * LinkList_Get(LinkList * list, int pos);
LinkListNode * LinkList_Delete(LinkList * list, int pos);
#endif