单链表
表的实现:
- 数组:可以用动态数组实现,但是,删除和插入的开销太大。
- 链表:由内存中一系列不相连的结构连成;每个结构含有表元素和指向下一个结构的指针;
链表的实现:
ps:为了方便删除和插入,我们设置一个头节点;
- 节点:包含一个元素和指向下一个节点的指针;
1 struct Node{ 2 int Element; 3 struct Node *Next; 4 }
- 链表的置空:把链表的头节点的Next指向NULL
1 List MakeEmpty(List L) 2 { 3 L->Next=NULL; 4 return L; 5 }
- 测试链表是否为空
int isEmpty(List L) { return L->Next == NULL; }
- 查找:返回元素所在的位置;
Position Find(ElementType x,List L) { Position p; p = L->Next; while(p!=NULL && p->ElementType !=x) p=p->Next; return p; }
- 查找指定元素的前继元:
Position FindPrevious(ElementType x,List L) { Position p; p = L; while(p->Next!=NULL && p->Next-Element !=x) p=p->Next; return p; }
-
删除:删除元素之前要保存它的位置,使用FindPrevious()获取它的前继,如果获取的是最后一个则没找到此元素;
void Delect(ElementType x,List L) { Position p,tmp; P = FindPrevious(x,L); if(!isLast(p,L)) // 测试是否为最后一个 { tmp = p->Next; p->Next = tmp->Next; free(tmp); } }
- 插入:插入可以有多种设计,我们选择插入指定位置的后面。
void Insert(ElementType x,Position p,List L) { Position tmp; tmp = (Position)malloc(sizeof(struct Node)); if(tmp==NULL) printf("out of space!\n"); else { tmp->Element = x; tmp->Next = p->Next; p->Next = tmp; } }
浙公网安备 33010602011771号