摘要:(1)链表基本上市最基本也最重要的数据结构之一了,下面简单分析一下基本结构与操作
(2)单链表(还有其它类项后面分析)有一个元素(任意类型)和一个指针组成。(可以视情况加一些附加结构)
(3)查插入操作:(1)插入操作,非常简单,找到要插入位置的前一个元素,然后断开它与后一个元素的指针,连接到新元素上。然后将新元素指针指向后一个元素(所以这里需要保留原来的节点).
(2)创建并初始化,利用malloc函数分配内存,注意编译器的原因,可能要加强制转换类型。
(3)删除操作:找到要删除元素的前一个,将其指针直接指向要删除节点的后一个节点(相当于绕过要删除节点),然后用free函数将要删除节点释放(所以也需要一开始保存该节点,否则会丢掉该节点的地址导致无法释放相应内存)
(5)找到前一个元素的操作:Findprevious函数,如果找不到就返回最后一个。
(4)细节问题:注意处理节点为空的特殊情况,一定小心,因为引用一个地址为NULL的节点中的元素为出错(该节点并没有分配内存)。
#include "stdafx.h"
#include "stdlib.h"
#include "malloc.h"
#include "time.h"
typedef struct Node *PtrtoNode;
struct Node
{
int Element;
PtrtoNode Next;
};
typedef PtrtoNode List;
List Create(int N)//用来创建一个单向链表
{
List P,L ;
L = (List)malloc(sizeof( struct Node));
P = L;
for (int i = 1;i<=N;i++)
{
P->Next = (List)malloc(sizeof( struct Node));
P = P->Next;
P->Element = i;
}
P->Next = NULL;
return L;
}
List FindPrevious(List L,List X)//找到X的前一个元素,也可能返回最后一个
{
List P;
P = L;
while(P->Next!=NULL&&P->Next!=X)
P = P->Next;
return P;
}
List Delete(List L,List P)//删除循环无表头链表,返回删除节点的后一个;有可能返回随机地址
{
List temp;
temp = FindPrevious(L,P);
temp->Next = P->Next;
temp = temp->Next;
free(P);
return temp;
}