链表的各种操作
来源:互联网 发布:主成分分析数据标准化 编辑:程序博客网 时间:2024/05/01 17:31
链表元素的存储单元可以连续也可以不连续。
链式存储结构相对于顺序存储结构的优点在于进行插入和删除或者需要移动大量元素比较方便,缺点是每次操作都必须要从链表头结点开始顺序往后进行。
循环链表是最后一个节点的指针域指向头结点,整个链表形成一个环,操作跟线性链表基本一样。注意,判断是否循环链表依据是节点的指针是否等于头结点,而不是p或者
p->next == NULL。
所以只需看线性链表的操作即可。
定义链表节点结构:
//定义链表结构体typedef struct LinkNode {int data;struct LinkNode *next;}LinkNode,*LinkList;
链表的各种基本操作:
1、创建链表(尾插法使输入和遍历输出顺序一致,也可以采用头插法)
//创建链表--尾插法void CreateLinkList(LinkList &L){int N;//结点个数cout<<"输入结点个数:";cin>>N;int i;LinkList p,s;L = (LinkList)malloc(sizeof(LinkNode));//头结点L->next = NULL;p = L;cout<<"依次输入各个节点值:";for (i = 0; i < N; i++){s = (LinkList)malloc(sizeof(LinkNode));cin>>s->data;s->next = NULL;p->next = s;p = s;}}
2、判断是否为空链表
//判断链表是否为空bool EmptyLinkLinst(LinkList L){return (L->next == NULL);}
3、链表的长度
int LengthLinkList(LinkList L){LinkList p;int length = 0;p = L->next;while(p != NULL){length++;p = p->next;}return length;}
4、遍历链表
void VisitLinkList(LinkList L){LinkList p;p = L->next;while (p != NULL){cout<<p->data<<" ";p = p->next;}}
5、插入元素操作
void InsertLinkNode(LinkList &L, int n, int element){if (n >LengthLinkList(L) || n <= 0){cout<<"插入位置错误!"<<endl;return;} else{LinkList p,s;int j = 0;p = L;while(p && j < n-1){p = p->next;j++;}//n值不合法if(NULL == p || j > n-1) return;s = (LinkList)malloc(sizeof(LinkNode));s->data = element;s->next = p->next;p->next = s;}}
6、删除节点操作
void DeleteLinkNode(LinkList &L, int n){LinkList p,s;p = L;int j = 0;while ((p->next != NULL)&& j < n-1){p = p->next;j++;}if ((NULL == p->next) || (j > n-1)) return;else{s = p->next;p->next = s->next;free(s);}}
7、返回第i个元素
//返回第n个元素int GetElement(LinkList L, int n){int element;LinkList p;p = L;int j = 0;while(p && j <= n-1){p = p->next;j++;}if(NULL == p || j > n) return -1;element = p->data;return element;}
8、查找元素
void CheckElement(LinkList L, int element){LinkList p;p = L->next;while(p != NULL){if (p->data == element){cout<<"找到元素"<<element<<endl;return;}p = p->next;}if (p == NULL){cout<<"没有找到该元素"<<endl;}}
9、销毁链表
//销毁链表void DestroyLinkList(LinkList &L){LinkList p,s;p = L->next;while (p != NULL){s = p;p = p->next;L->next = p;free(s);}free(L);//销毁头结点,此后不能再使用此链表进行操作了}
- 链表的各种操作
- 链表的各种操作
- 链表的各种操作
- 链表的各种操作
- 链表的各种操作
- 链表的各种操作
- LinuxC双向链表的各种操作
- 链表的各种操作java版本
- 链表各种操作
- 线性表的各种操作
- 顺序表的各种操作
- 顺序表的各种操作
- 各种线性表的操作
- 各种图的各种操作
- 链表的各种操作的实现和改进
- 实现链表的各种操作(利用链表来实现)
- 使用Lua实现链表的各种操作
- 链表的建立以及各种基本操作
- s2sh向数据库插入数据,控制台有打印sql语句,数据库查询不到数据问题
- 瓶颈算法
- ./执行文本和sh命令执行文本的区别
- accept函数出现“Invalid Argument”的原因
- 移植驱动cs8900的一点经验笔记
- 链表的各种操作
- oracle--left join and 和left join where的区别
- HGE做格斗游戏的热点图片碰撞检测法
- 最简单也是最实用的-批处理(一)
- 最近在做NAT时写的一个双向链表(vc6.0和linux下测试通过)
- select详细
- PHP中搜索结果分页的几种方法(转载)
- 一个关于POP3协议超时的问题
- 设计模式之5 责任链