单向链表的创建和功能

阅读: 评论:0

单向链表的创建和功能

单向链表的创建和功能

一,创建

vi -O linklist.h linklist.c main.c 

1.linklist.h

​
#ifndef __LINKLIST_H_
#define __LINKLIST_H_typedef char datatype;typedef struct Node
{union{int len;     //头结点数据域datatype data;   //普通结点数据域};struct Node *next;          //指针域
}Linklist;//创建链表
Linklist *list_create();//判空
int list_empty(Linklist *L);//申请结点封装函数
Linklist *buy_note(datatype e);//头插
int list_insert_head(Linklist *L, datatype e);//遍历
void list_show(Linklist *L);//尾插
int list_insert_taii(Linklist *L, datatype e);//按位置查找返回结点
Linklist*  find_node(Linklist *L, int pos);//按位置进行插入
int  list_insert_pos(Linklist *L, int pos, datatype e);//头删
int list_delete_head(Linklist *L);//尾删
int list_delete_taii(Linklist *L);//任意位置删除
int list_delete_pos(Linklist *L, int pos);//按位置进行修改
int list_updata_pos(Linklist *L, int pos, datatype new_e);//按值进行查找,返回节点位置
int list_insert_value(Linklist *L, datatype e);//按值修改
int list_updata_value(Linklist *L, datatype e, datatype new_e);//链表反转
void list_reverse(Linklist *L);//链表释放
void list_free(Linklist *L);#endif​

2.linklist.c

#include <stdlib.h>
#include <stdio.h>
#include "linklist.h"//创建链表
Linklist *list_create()
{//申请一个节点空间Linklist *L = (Linklist*)malloc(sizeof(Linklist));if (NULL == L){printf("创建失败n");return NULL;}//创建成功进行初L始化L->len =0;L->next = NULL;printf("创建成功n");return L;   //将创建好的链表返回
}//判空
int list_empty(Linklist *L)
{return L->next==NULL ? 1:0;   //1表示空,0表示非空
}//申请结点封装函数
Linklist *buy_note(datatype e)
{//在堆区申请一个结点的空间Linklist *p = (Linklist*)malloc(sizeof(Linklist));if (NULL==p){printf("空间申请失败n");return NULL;}//将数据封装到结点的数据域中p->data = e;p->next = NULL;return p;
}//头插
int list_insert_head(Linklist *L,datatype e)
{//判断逻辑if (NULL==L){printf("所给链表不合法n");return -1;}//申请结点封装函数Linklist *p = buy_note(e);//头插逻辑p->next = L->next;L->next = p;//表的变化L->len++;printf("头插成功n");return 1;}//链表反转
void list_reverse(Linklist *L);//遍历
void list_show(Linklist *L)
{//判断逻辑if (NULL==L || list_empty(L)){printf("遍历失败n");return ;}//遍历逻辑printf("此时链表元素分别为:");Linklist *q = L->next;while (q!=NULL){printf("%c  ", q->data);q = q->next;}printf("n");
}//尾插
int list_insert_taii(Linklist *L,datatype e)
{//判断逻辑if (NULL==L){printf("所给链表不合法n");return 0;}//申请结点封装函数Linklist *p = buy_note(e);//Linklist *q = L;while (q->next != NULL){q = q->next;}//尾插操作p->next = q->next;q->next = p;//表长变化L->len++;printf("尾插成功n");}//按位置查找返回结点
Linklist*  find_node(Linklist *L, int pos)
{//判断逻辑if (pos<0 || pos>L->len){printf("插入失败n");return NULL;}//查找逻辑Linklist *q = L;for (int i=0; i<pos; i++){q = q->next;}return q;}//按位置进行插入
int  list_insert_pos(Linklist *L, int pos, datatype e)
{//判断逻辑if (NULL==L || pos<1 || pos>L->len+1){printf("所给链表不合法n");return 0;}//申请结点封装函数Linklist *p = buy_note(e);if (NULL==p){printf("申请结点不成功n");return 0;}//找到插入位置的前驱结点Linklist *q = find_node(L, pos-1);if (NULL==q){printf("前驱结点查找失败n");return 0;}//插入逻辑p->next = q->next;q->next = p;//表长变化L->len++;printf("插入成功n");return 1;}//头删
int list_delete_head(Linklist *L)
{//判断逻辑if (NULL==L || list_empty(L)){printf("所给链表不合法n");return 0;}//删除逻辑Linklist *p = L->next;  //标记要删除的结点L->next = p->next;      //孤立要删除的结点free(p);//表长变化L->len--;printf("删除成功n");return 1;}
//尾删
int list_delete_taii(Linklist *L)
{//判断逻辑if (NULL==L || list_empty(L)){printf("所给链表不合法n");return 0;}//找到倒数第二个结点(1)//Linklist *q = find_node(L, L->len-1);//找到倒数第二个结点(2)Linklist *q = L;while (q->next->next != NULL){q = q->next;}//删除逻辑(1)Linklist *p = q->next;q->next = p->next;free(p);p = NULL;//删除逻辑(2)   //free(q->next);//q->next = NULL;//表长变化L->len--;printf("删除成功n");return 1;}//任意位置删除
int list_delete_pos(Linklist *L, int pos)
{//判断逻辑if (NULL==L || list_empty(L) || pos<1 || pos>L->len){printf("删除失败n");return 0;}//找到要删除位置的前驱Linklist *q = find_node(L, pos-1);if (q==NULL){printf("删除失败n");return 0;}//删除逻辑Linklist *p = q->next;q->next = p->next;free(p);p = NULL;//表长变化L->len--;printf("删除成功n");return 1;}//按位置进行修改
int list_updata_pos(Linklist *L, int pos, datatype new_e)
{//判断逻辑if (NULL==L || list_empty(L) || pos<1 || pos>L->len){printf("修改失败n");return 0;}//查找到要修改的结点Linklist *p = find_node(L, pos);//更新数据p->data = new_e;printf("修改成功n");return 1;}//按值进行查找,返回节点位置
int list_insert_value(Linklist *L, datatype e)
{//判断逻辑if (NULL==L || list_empty(L)){printf("查找失败n");return -1;}//查找逻辑Linklist *q = L->next;for (int i=1; i<=L->len; i++){if (q->data == e){return i;}q = q->next;}return 0;}//按值修改
int list_updata_value(Linklist *L, datatype e, datatype new_e)
{int ele = list_insert_value(L, e);list_updata_pos(L, ele, new_e);printf("修改成功n");return 1;
}//链表反转
void list_reverse(Linklist *L)
{//判断逻辑if (NULL==L || list_empty(L)){printf("查找失败n");}//反转逻辑for (int i=0; i<L->len-1; i++){datatype e = L->next->data;list_delete_head(L);            //头删list_insert_pos(L, L->len-i+1, e);//按位置进行插入}}	//链表释放
void list_free(Linklist *L)
{//判断逻辑if (NULL!=L){//循环进行头删while (L->next != NULL){list_delete_head(L);}//释放头结点free;L = NULL;printf("释放成功n");}
}

3.main.c

#include <stdio.h>
#include "linklist.h"int main(int argc, const char *argv[])
{Linklist *L = list_create();if (NULL==L){return -1;}//调用头插函数list_insert_head(L,'Q');list_insert_head(L,'W');list_insert_head(L,'E');list_insert_head(L,'R');//调用遍历逻辑list_show(L);//调用尾插函数list_insert_taii(L,'t');list_show(L);//调用按位置插入函数list_insert_pos(L,3,'s');list_show(L);//调用头删函数list_delete_head(L);list_show(L);//调用尾删函数list_delete_taii(L);list_show(L);//调用任意位置删除函数list_delete_pos(L, 3);list_show(L);//调用任意位置修改函数list_updata_pos(L, 3, 'c');list_show(L);//调用查找函数int res = list_insert_value(L, 'c');if (res<=0){printf("查找失败n");}else{printf("你要找的在%dn",res);}//调用按值修改list_updata_value(L, 'c', 'o');list_show(L);//调用反转逻辑list_reverse(L);list_show(L);//调用链表释放函数list_free(L);L = NULL;list_show(L);return 0;
}

本文发布于:2024-01-28 06:06:39,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063932035342.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:链表   功能
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23