链表是包含一些数据的独立数据结构(也成为节点)的集合,每个节点都是通过指针链接在一起的。通常节点是动态分配的。事实上,链表中的节点可以存在于内存中的各个地方。,所以在物理上是不是相邻并无影响。
链表在数据结构中占有很大的作用,它可以根据使用情况分配内存,避免内存的浪费。它的插入,删除,查找都是根据指针的访问来实现,删除或添加一个节点不会改变其他数据的位置和内容,和数组相比,链表具有很强的灵活性和可操作性,但是在使用和实现的时候稍微麻烦,而且比较抽象。
单链表
在单链表中,每个节点都包含指向下一个节点的指针,最后一个节点的指针为NULL,以标志最后一个节点。之所以叫单链表也是因为每个节点只存在一个节点指针而已,所以只能顺序访问下一个节点,俗话就是过了这个村就没这个店了。为了记住单链表的第一个位置,可以定义一个头指针head。
/**
* 建立单链表中,函数是一个指针函数,指针类型是节点,它最终的返回值是头节点。函数里建立了三个节点指针,
* 分别是头节点指针,当前节点指针和前一个节点指针。先建立头指针,数据为0,指针为NULL。通过传递给该函
* 数的参数n来确定节点的个数。在n个循环内一直建立当前节点,当前节点的数据键盘输入,当前节点指针为空。
* 前一节点的指针指向当前节点,最后把当前指针替换为前一个指针进行下一次循环。
* @param n
* @return
*/
Node createChain(int n){
Node head,current,previous;
int i;
previous = new Node();
previous.setNodeValue(0);
previous.setNextNode(null);
head = previous;
for(i=0;i<n;i++){
current = new Node();
current.setNextNode(null);
previous.setNextNode(current);
previous = current;
}
return head;
}
/**
* 函数中,先遍历节点,直到找到需要添加节点的位置,如果遍历到最后一个节点,函数返回,如果跳出遍历循环,
* 说明是插入位置,申请一个新的节点,数据为x,指针指向当前节点指向的后一个节点,当前节点(实际上已经是
* 旧的节点)指向新节点
* @param head
* @param i
* @param m
* @return
*/
int insert(Node head,int i,int m){
Node current,newNode;
int j;
if(i < 1)
return 0;
current = head;
j = 0;
while((j<i-1)&¤t != null ){
current = current.getNextNode();
j++;
}
if(current == null)
return 0;
newNode = new Node();
newNode.setNodeValue(m);
newNode.setNextNode(current.getNextNode());
current.setNextNode(newNode);
return 1;
}
/**
* 函数中,先遍历节点,直到找到需要删除节点的位置,将需要删除的节点前一个节点的指针指向其后一个节点,释放内存。
* @param head
* @param i
* @return
*/
int delete(Node head,int i){
Node current,previous;
int j=1;
if(i < 0)
return 0;
previous = head;
while((j<i)&&previous.getNextNode() != null){
previous = previous.getNextNode();
j++;
}
if(previous.getNextNode() == null)
return 0;
current = previous.getNextNode();
previous.setNextNode(current.getNextNode());
current = null;
return 1;
}
}
class Node{
public int getNodeValue() {
return nodeValue;
}
public void setNodeValue(int nodeValue) {
this.nodeValue = nodeValue;
}
public Node getNextNode() {
return nextNode;
}
public void setNextNode(Node nextNode) {
this.nextNode = nextNode;
}
private int nodeValue;
private Node nextNode;
public Node(){
this(0,null);
}
public Node(int value,Node nextNode){
this.nodeValue = value;
this.nextNode = nextNode;
}
}
分享到:
相关推荐
本话题涉及的是一个C语言初学者对于链表操作的实践,这在数据结构和算法学习中是非常重要的一部分。链表是一种动态数据结构,与数组不同,它不依赖于内存中的连续空间,而是通过指针连接各个元素。 首先,我们来看...
C语言中关于链表的总结内容,内附代码例题,详细的有条理的讲解链表内容
关于链表的面试题主要考察应聘者对链表这种基本数据结构的理解和操作能力,下面详细讲解每个面试题所涉及的知识点。 题一检测单链表是否有环的知识点: 要检测链表是否有环,可以使用快慢指针的方法。具体操作为,...
以下是关于链表的资源描述和一个简化版的项目源码概述。 资源描述: 链表主要由表头、节点和表尾组成。表头通常只有指针域,指向第一个节点;节点包含数据域和指针域,数据域存放数据信息,指针域指向下一个节点;...
总之,"Delphi关于链表的演示"这个项目旨在通过实际操作教会开发者如何在Delphi中实现C++风格的链表,包括创建链表节点,定义链表类以及实现各种链表操作。这不仅有助于提高对数据结构的理解,还能增强在Delphi环境...
在本文中,我们将深入探讨线性单链表的创建和操作,包括链表结点的定义、链表指针类型、创建链表结点的函数、创建线性表的函数、向链表末尾追加元素、获取链表元素地址、删除链表元素以及清空链表。 首先,链表结点...
自己写的关于链表的测试程序,自己测试了下,感觉还行,与大家分享一下!
期末课程设计题目,使用C++实现关于链表的基本操作,本人也是学生,初学,写的不好,仅供参考。
以下将详细讲解链表的基础知识,以及如何利用链表解决大数阶乘的计算问题。 首先,链表是一种数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的引用。与数组不同,链表中的元素不需要在内存中连续...
1.向链表中添加新的数据(表中数据按升序排列) 2.输出链表中的数据 3.删除链表中的某一数据 4.输出输入数据的前驱 5.输出数据的后继元素 6.输出数据的第一个元素 7.输出链表的最后一个元素 8.释放内存退出程序
用vs2010写的关于数据结构链表等的一些应用
本文将深入解析链表的一些关键概念,如链表的反向、链表的合并、链表的内存占用等问题,并通过具体的代码示例来探讨链表逆序的操作方法。 ### 链表的反向 链表的反向是指将链表中节点的顺序颠倒过来,这一操作在...
链表是一种基础且重要的数据结构,它在计算机科学和编程中扮演着不可或缺的角色。与数组不同,链表的元素在内存中不是连续存储的,而是通过指针或引用相互连接。这种特性使得链表在某些操作上具有优势,尤其是在动态...
在本示例中,我们探讨了如何使用C++语言实现一个简单的链表操作,特别是针对学生数据的链表。链表是一种数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。这里,我们创建了一个名为`student`...
链表是一种基础且重要的数据结构,它在计算机科学中扮演着关键角色,特别是在处理动态数据集合时。在C语言中,链表的实现通常涉及指针的使用,因为C语言不提供内置的数据结构来直接支持链表。接下来,我们将深入探讨...
链表在C语言中也是很重要的,数据结构在C的编程中是必不可少的。
总的来说,这个资料包提供了关于链表实现的全面资源,无论是对初学者还是经验丰富的开发者,都能从中受益,加深对链表的理解,并能够在实际项目中灵活运用。通过学习和实践这些源码,我们可以更好地掌握链表这一基础...
将linux内核源码中list.h拿出来, 增删与遍历部分写了详细注释, 关于链表合并, 没用过所以没写. 源码版本是2.6.32, 不过链表的源码改动应该不是很大. 我的邮箱2253238252@qq.com, 代码有什么不对的欢迎发邮件给我
对新手来说很好 因为全面的学习链表的知识。
以下是一些关于链表操作和避免此类异常的关键知识点: 1. **链表节点结构**:链表的每个元素称为节点,由数据部分和指向下一个节点的指针组成。在C语言中,可以定义一个结构体类型来表示节点: ```c typedef ...