带头结点的链表的创建与操作
来源:互联网 发布:新浪邮箱smtp端口号 编辑:程序博客网 时间:2024/04/30 05:54
链表比数组的优势在于,它可提供高效的重排数据的能力,插入和删除操作比数组简单,因为在进行插入和删除过程中不需要移动收到影响的数据项之后的所有元素。
劣势在于:不能快速访问链表中的任意项。
list.c
#include<stdio.h>#include<stdlib.h>#include "list.h"List MakeEmpty(List L){if(L !=NULL)DeleteList(L);L=malloc(sizeof(struct Node));if(NULL==L)printf("out of memeory!");L->Next=NULL;return L;}///* Return true if L is empty */int IsEmpty(List L){return L->Next==NULL;}/* Return true if P is the last position in list L *//* Parameter L is unused in this implementation */int IsLast(Position P,List L){return P->Next==NULL;}/* Return Position of X in L; NULL if not found */Position Find(ElementType X,List L){Position P;P=L->Next;while(P){if(P->Element== X)break;P=P->Next;}return P;}void Delete(ElementType X,List L){Position P,TmpCell;P=FindPrevious(X,L);if(!IsLast(P,L)){TmpCell=P->Next;P->Next=TmpCell->Next;free(TmpCell);}}Position FindPrevious(ElementType X,List L){Position P;P=L;while(P->Next!=NULL && P->Next->Element!=X)P=P->Next;return P;}//将一个元素插入到由P所指示的位置之后void Insert(ElementType X,List L,Position P){Position TmpCell;TmpCell=malloc(sizeof(struct Node));if(TmpCell==NULL)printf("out of memory");TmpCell->Element=X;TmpCell->Next=P->Next; P->Next=TmpCell;}void DeleteList(List L){Position P,Tmp;//L->Next=NULL;P=Advance(L);//p=L->Next;L->next=NULL;while(NULL!=P){ Tmp=P->Next; free(P); P=Tmp;}} Position Header(List L){return L;//返回头结点指针}Position Frist(List L){return L->Next;//返回头结点之后的第一个实结点的指针}Position Advance(Position P){ return P->Next;//返回指针p指向结点的下一个结点}ElementType Retrieve(Position P){return P->Element;}
list.h
typedef int ElementType;#ifndef _List_H#define _List_Hstruct Node;typedef struct Node *PtrToNode;typedef PtrToNode List;typedef PtrToNode Position;struct Node{ElementType Element;Position Next;};List MakeEmpty(List L);int IsEmpty(List L);int IsLast(Position P,List L);Position Find(ElementType X,List L);void Delete(ElementType X,List L);Position FindPrevious(ElementType X,List L);void Insert(ElementType X,List L,Position P);void DeleteList(List L);Position Header(List L);Position Frist(List L);Position Advance(Position P);ElementType Retrieve(Position P);#endif
main.c
/******************************************************************* *author:jia * *purpose:带有头结点的链表的创建与相关操作 * *Date:2014.3.10 * *******************************************************************/#include<stdio.h>#include "list.h"void PrintList(const List L){Position P = L->Next;if(IsEmpty(L))printf("Empty list!\n");while(P != NULL){printf("%d ",P->Element);P=P->Next;} printf("\n");}int main(void){List L;Position P;int i; L=MakeEmpty(NULL);P=Header(L);PrintList(L);for(i=0;i<10;i++){Insert(i,L,P);PrintList(L);P=Advance(P);}for(i=0;i<10;i+=2){Delete(i,L);} if(NULL==Find(2,L)){printf("Find fails!\n");} printf("Finished deletions\n");PrintList(L);DeleteList(L); return 0;}
0 0
- 带头结点的链表的创建与操作
- 创建带头结点链表的方法
- 带头结点的链表基本操作
- 单链表反转问题(带头结点 和 不带头结点的 创建链表过程等)
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- 带头结点的链表
- 带头结点的链表
- 带头结点的链表
- 带头结点的链栈操作
- 带头结点的链式表操作集
- 带头结点的链式表操作集
- 带头结点的链式表操作集
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- 带头结点的线性链表的基本操作
- 单链表的创建--带头结点
- 带头结点的循环链表基本操作
- 不带头结点的链表操作及其逆置
- c语言的堆栈机制
- 一步步学习微软InfoPath2010和SP2010--第一章节--介绍InfoPath2010(6)--创建Products.xml文件
- iOS 辅助开发工具
- C# bool true, false 操作符重载,用在 if, while等语句中
- HDU 2196 Computer(树形DP)
- 带头结点的链表的创建与操作
- 黑马程序员_OC基础03_类的本质(load\initialize)
- toj 1056 Labyrinth 搜索,树的直径
- 一步步学习微软InfoPath2010和SP2010--第一章节--介绍InfoPath2010(7)--添加Products.xml到表单作为数据连接
- 从操作系统内核解释电脑死机原理
- 搭建自己的知识体系 自我提升
- Python3.2官方文档教程--数字
- 64位Win8系统下WinIO的使用 VS2010 驱动级模拟按键
- C++与C语言字符串头文件及其对应的操作