单向不带头结点不带环的链表实现
2018-03-25 17:38
447 查看
链表有很多种类,单向,双向,不带头,带头,不带环,带环,结合起来一共可以有八种链表形式;
今天我们来实现一种名字叫 单向不带头不带环的链表
下面就是每一部分的代码实现
首先我们要做的就是函数的声明,结构体的定义,头文件的引用
接下来我们就要一步一步实现我们的功能
首先我们要初始化我们的链表;
链表打印代码的实现
下来我们还要实现我们的创建函数的代码
好,我们准备工作都做好了,现在我们就要实现它的一些功能了
以上就是链表的一些功能的实现,相互学习,如果有错误,请指正
今天我们来实现一种名字叫 单向不带头不带环的链表
下面就是每一部分的代码实现
首先我们要做的就是函数的声明,结构体的定义,头文件的引用
#pragma once #define HEADER printf("\n----------%s------------\n",__FUNCTION__) #include<stdio.h> #include<stdlib.h> #include<stddef.h> typedef char linktype; typedef struct linklist { linktype data; struct linklist *next; }linklist; linklist *head; void linklist_init(linklist **head); linklist *creat(linktype value); void linklist_print(linklist *head); void linklist_pushback(linklist **head,linktype value); void linklist_popback(linklist **head); void linklist_pushfront(linklist **head,linktype value); void linklist_popfront(linklist **head); linklist *linklist_find(linklist *head,linktype value); void linklist_pushhighleft(linklist **head,linklist *pos,linktype value); void linklist_pushhighright(linklist **head,linklist *pos,linktype value); void linklist_pop1(linklist **head,linklist *pos); void linklist_pop2(linklist **head,linktype value); void linklist_pop2plus(linklist **head,linktype value); void linklist_nizhi(linklist *head);
接下来我们就要一步一步实现我们的功能
首先我们要初始化我们的链表;
链表的初始化 void linklist_init(linklist **head) { if(head==NULL) { return;//非法输入 } else { *head=NULL; } }
链表打印代码的实现
void linklist_print(linklist *head) { if(head==NULL) cbc8 { return;//空链表 } else { linklist *cur=head; while(cur) { printf("[%c|%p] ",cur->data,cur); cur=cur->next; } printf("\n"); } }
下来我们还要实现我们的创建函数的代码
linklist *creat(linktype value) { linklist *newnode=(linklist *)malloc(sizeof(linklist)); if(newnode==NULL) { return NULL;//申请失败 } else { newnode->data=value; newnode->next=NULL; return newnode; } }
好,我们准备工作都做好了,现在我们就要实现它的一些功能了
首先我们来实现链表的尾插
void linklist_pushback(linklist **head,linktype value) { if(head==NULL) { return;//非法输入 } if(*head==NULL) { *head=creat(value); return; } else { linklist *cur=*head; while(cur->next) { cur=cur->next; } cur=creat(value); } }
下面我们来实现尾删的功能
void linklist_popback(linklist **head) { if(head==NULL) { return;//非法输入 } if(*head==NULL) { return;//空链表 } else { linklist *cur=*head; while(cur->next->next) { cur=cur->next; } free(cur->next); cur->next=NULL; } }
接着我们要来实现头插,头删的操作
void linklist_pushfront(linklist **head,linktype value) { if(head==NULL) { return;//非法输入 } if(*head==NULL) { *head=creat(value); return; } else { linklist *newnode=creat(value); newnode->next=*head; *head=newnode; } }
头删
void linklist_popfront(linklist **head) { if(head==NULL) { return;//非法输入 } if(*head==NULL) { return;//空链表 } eles { linklist *cur=*head; *head=(*head)->next; free(cur); cur=NULL; } }
下面我们要实现的是给定元素,查找它的位置
linklist * linklist_find(linklist *head,linktype value) { if(head==NULL) { return;//空链表 } else { linklist *cur=head; while(cur!=NULL) { if(cur->data!=value) { cur=cur->next; } else { return cur; } } printf("没找到\n"); return ; } }
接下来我们要增加插入的难度,
首先我们就要进行,在指定位置之前插入元素value
void linklist_pushhighleft(linklist **head,linklist *pos,linktype value) { if(head==NULL) { return;//非法输入 } if(*head==NUll) { *head=creat(value); return; } else { linklist *cur=*head; while(cur->next!=pos) { cur=cur->next; } linklist *newnode=creat(value); newnode->next=pos; cur->next=newnode; } }
在指定位置之后插入节点
void linklist_pushhighright(linklist **head,linklist *pos,linktype value) { if(head==NULL) { return;//非法输入 } if(*head==NULL) { *head=creat(value); return; } else { linklist *newnode=creat(value); newnode->next=pos->next; pos->next=newnode; } }
下面我们要来实现删除的更高级版本
首先就是删除某一位置的节点
void linklist_pop1(linklist **head,linklist *pos) { if(head==NULL) { return;//非法输入 } if(*head==NULL) { return;//空链表 } if(*head==pos) { *head=pos->next; free(pos); pos=NULL; } else { linklist *cur=*head; while(cur->next!=pos) { cur=cur->next; } cur->next=pos->next; free(pos); pos=NULL; } }
删除指定元素的节点
void linklist_pop2(linklist **head,linktype value) { if(head==NULL) { return;//非法输入 } if(*head==NULL) { return;//空链表 } else { linklist *pos=linklist_find(*head,value); linklist_pop1(head,pos); } }
删除指定元素的所有节点
void linklist_pop2plus(linklist **head,linktype value) { if(head==NULL) { return;//非法输入 } if(*head==NULL) { return;//空链表 } else { linklist *cur=*head; while(cur!=NULL) { if(cur->data!=value) { cur=cur->next; } linklist *p=cur; cur=p->next; linklist_pop1(head,p); } } }
最后我们来看下将链表逆序打印是如何操作的
void linklist_nizhi(linklist *head) { if(head==NULL) { return;//空链表 } else { linklist_nizhi(head->next); printf("[%c|%p] ",head->data,head); } }
以上就是链表的一些功能的实现,相互学习,如果有错误,请指正
相关文章推荐
- C语言实现,无头结点不带环的单向链表的基本操作
- !-- 带头结点带环的双向链表的相关操作实现 --!
- 线性表的链式存储结构_单向链表[带头结点]_C#实现
- !-- 不带头结点不带环的单链表相关操作实现 --!
- 数据结构之双向带头节点带环链表的实现
- 不带头结点的单向链表排序——插入排序(C语言)
- 创建带表头结点的单向链表,并实现各种功能
- 带头结点的单链表实现
- 线性表——带头结点单链表的实现
- 数据结构(5)线性表之链表C++实现带头结点的单链表合并
- 数据结构模版----单链表SimpleLinkList[不带头结点&&伪OO](C语言实现)
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- 统计带头结点的单向链表的个数并存放在形参n所指的单元中。 欢迎评论 指点。
- 带头结点的循环单向链表
- 带头结点的单链表实现(C++)
- C++实现带头结点的单链表(友元类)
- C语言实现链表之单向链表(十三)获取数据对应的结点
- C++实现带头结点单链表
- 不带头结点的单链表反转 三种不同方法实现
- 数据结构模版----单链表SimpleLinkList[不带头结点](C语言实现)