C语言之单向链表详解及实例代码

1,单向链简洁。

单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指列表中的下一个结点;列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向nuLL的指针;

2,例子要求:

根据示例代码中的例子,完成单向链表(single linked list)中的以字符串为数据的链表的插入、删除以及查找,并支持单向链表的反转;

3,代码实现。

#include <stdio.h>
#include <math.h>
#include <cstring>
#include <memory.h>
#include <malloc.h>

//节点的定义
typedef struct Node {
 void *data; //数据域 //链域
 struct Node *next;
} NodeStruct, *pNode;

pNode head = NULL;

typedef char (*pCompareFunc)(void *a, void *b);
typedef void* (*pChar)(void *p);

// 字符串判断
int str_compare(void *a, void *b) {
 char *pa = (char*)a;
 char *pb = (char*)b;
 return strcmp(pa , pb);
}

// 分配一个节点
pNode allocate_node(void *data, pChar char_func) {
 pNode node = allocate();
 node->data = char_func(data);
 return node;
}

// 创建节点
pNode allocate() {
 void *p = malloc(sizeof(NodeStruct));
 pNode node = (pNode)p;
 node->next = NULL;
 node->data = NULL;
 return node;
}

// 添加一个节点
void insertNode(pNode node){
 if (head == null){
  head=node;
  }
  else {
  node->next = head;
  head = node;
  }
}

void* char_char(void *p) {
 char* pa = (char*)malloc(sizeof(char));
 memcpy(pa, p, sizeof(char));
 return pa;
}

// 初始化节点
pNode allocate_node(void *data, pChar char_func) {
 pNode node = allocate();
 node->data = char_func(data);
 return node;
}

// 释放资源
void free_list(pNode node) {
 pNode next = node;

 while (next != NULL) {
  if (next->data != NULL)
   free(next->data);
  pNode temp = next;
  next = next->next;
  free(temp);
 }
}

// 1.1 添加一个节点
void insert(pNode node) {
 if (head == NULL)
  head = node;
 else {
  node->next = head;
  head = node;
 }
}

//1.2查找
int str_search(void* data,pCompareFunc compare){
 pNode next = head;
 pNode prev = NULL;
 while (next != NULL ) {
  if (compare(data, next->data) == 0) {
   // 如果查找到了,就退出返回1
   return 1;
   break;
  }
  prev = next;
  next = next->next;
 }
 // 如果一直查找不到,就返回0
 return 0;
}

// 1.3删除节点
void remove(void* data,pCompareFunc compare) {
 pNode next = head;
 pNode prev = NULL;
 while (next != NULL) {

  if (compare(data, next->data) == 0) {
   if (prev == NULL) {
    head = next->next;
    next->next = NULL;
    free_list(next);
   } else {
    prev->next = next->next;
    next->next = NULL;
    free_list(next);
   }
   break;
  }
  prev = next;
  next = next->next;
 }

}

//1.4反转
void invert_order()
{
  node *This,*prev;
  p=head.next;
  This=NULL;
  while(p) {
    prev=This;
    This=p;
    p=p->next;
    This->next=prev;

  }
  head.next=This;
}

void main(){
 // 1单向链表
 char a1[] = 'aaa1';
 char a2[] = 'aaa2';
 char a3[] = 'aaa3';
 // 1.1添加
 insertNode(allocate_node(a1, init_char));
 insertNode(allocate_node(a2, init_char));
 insertNode(allocate_node(a3, init_char));
 // 1.2查找
 int flag = 0;
 flag = str_search(&a2,str_compare);
 // 1.3删除
 remove(&a2,str_compare);
 // 1.4反转
  invert_order();

}

以上就是对 C语言单向联表的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

(0)

相关推荐

  • C语言数据结构 链表与归并排序实例详解

    C语言数据结构 链表与归并排序实例详解 归并排序适合于对链表进行原址排序,即只改变指针的连接方式,不交换链表结点的内容. 归并排序的基本思想是分治法:先把一个链表分割成只有一个节点的链表,然后按照一定顺序.自底向上合并相邻的两个链表. 只要保证各种大小的子链表是有序的,那么最后返回的链表就一定是有序的. 归并排序分为分割和合并两个子过程.分割是用递归的方法,把链表对半分割成两个子链表:合并是在递归返回(回朔)的时候,把两个有序链表合并成一个有序链表. (注意:只有一个节点的链表一定是有序的) 这

  • C++ 单链表的基本操作(详解)

    链表一直是面试的高频题,今天先总结一下单链表的使用,下节再总结双向链表的.本文主要有单链表的创建.插入.删除节点等. 1.概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个结点的构成:元素 + 指针,元素就是存储数据的存储单元,指针就是连接每个结点的地址数据.如下图: 2.链表的基本操作 SingleList.cpp: #include "stdafx.h" #include "SingleList.h&

  • C++ 双链表的基本操作(详解)

    1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 结构图如下所示: 2.基本操作实例 DoubleList.cpp #include "stdafx.h" #include "DoubleList.h" #include <stdio.h> #include <malloc.h>

  • Java实现单链表的各种操作

    主要内容: 单链表的基本操作 删除重复数据 找到倒数第k个元素 实现链表的反转 从尾到头输出链表 找到中间节点 检测链表是否有环 在不知道头指针的情况下删除指定节点 如何判断两个链表是否相交并找出相交节点 直接上代码,就是这么奔放~~~ package pers.ty.$1101datastructure; import java.util.Hashtable; /** * @author Administrator * 实现单链表的基本操作,增加删除节点.排序.打印.计算长度 */ publi

  • 详解Redis用链表实现消息队列

    前言 Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换.个人认为redis消息队列有一个好处,就是可以实现分布式和共享,就和memcache作为mysql的缓存和mysql自带的缓存一样. 链表实现消息队列 Redis链表支持前后插入以及前后取出,所以如果往尾部插入元素,往头部取出元素,这就是一种消息队列,也可以说是消费者/生产者模型.可以利用lpush和rpop来实现.但是有一个问题,如果链表中没有数据,那么消费者将要在while循环中调用rpop,这样以来就浪费cpu资源

  • C语言 数据结构之链表实现代码

    前言 最近在复习数据结构的相关知识,感觉在初学的时候还是有很多东西没有掌握,不过现在终于算是搞得比较有头绪了,所以就在写出来和大家一起分享! 什么是链表 简单的说,链表就是由多个结点离散分配,彼此通过指针相连,每个结点只有一个前驱结点和后继结点.首节点无前驱结点,为结点无后继结点的一种存储结构. 链表的结构 头结点:链表的第一个有效结点前面的结点,头结点并不存放有效数据,也就是数据域为空,加头结点的主要目的是为了方便链表的操作. 首节点:链表的第一个有效结点,结点包含数据域和指针域. 尾结点:尾

  • PHP单链表的实现代码

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 单链表简介 链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据. 关键代码如下所示: <?php /** * 单链表 */ class Demo { private $id; public $name; public $next; public function __construct ($id = ''

  • C语言之双向链表详解及实例代码

    1,双向链表简介. 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 2,例子要求: 完成双向链表的插入.删除以及查找,将学生管理系统使用的数组,以双向链表的方式实现,能够支持无限制的学生人数的增删改查以及保存. 3,代码实现. #include <stdio.h> #include <string.h> #include <

  • Java单链表基本操作的实现

    最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关于Web的学了一点Html+css+javascript.因为比较偏好,学习WinForm时比较认真,数据库操作也自己有所研究.但链表这个东西我还真没有学习和研究过,加上最近自己在看WPF,而课程也到了JSP了,比较紧. 但是我还是抽了一个晚上加半天的时间看了一下单向链表.并且使用Java试着写了一个实例出来.没有接触过链表的朋友可以作为参考,希望大家多提宝贵

  • C++ 数据结构链表的实现代码

    C++ 链表 之前一直没怎么在意C++中的链表,但是突然一下子让自己写,就老是出错.没办法,决定好好恶补一下该方面的知识,也为今后的数据结构大下个良好的基础,于是我总结出以下几点,有些地方可能不正确,还望大家不吝赐教,旨在共同进步. 总结: 1.链表List的基本单元是节点Node,因此想要操作方便,就必须为每一步打好基础,Node的基本结构如下: class Node{ public: int data; Node *next; Node(int da=0,Node *p=NULL){ thi

随机推荐