链表的声明及操作

#include<stdio.h>
#include<stdlib.h>
typedef struct Node *PtrToNode
typedef PtrToNode List
typedef PtrToNode Position

struct Node{
    ElementType Element;
    Position Next;
};

/*测试链表是否为空*/
int
IsEmpty(List L)
{
    return L->Next == Null;
}
/*测试是否是链表结尾的函数*/
int
IsLast(Position p,List L)
{
    return p->Next == Null;
}
/*Find例程*/
/*find position of X,Null if not found*/
Position
Find(ElementTYpe X,List L)
{
    Position p;
    p=L->Next;
    while(p != NULL && p->Element != X)
        p=p->Next;
    return p;
}
/*FindPrevious assume header node*/
Position
FindPrevious(List L,X)
{
    Position p;
    p=L;
    while(p->Next != NULL && p->Next->Element != X)
        p=p->Next;
    return p;//返回的p如果指向最后一个标元,那就是没找到
}
/*链表的删除例程*/
/*delete first occurence of X*/
/*assume header node use*/
void
Delete(List L,ElementType Element)
{
    Position p,TmpCell;
    p=FindPrevious(L,X);
    if(!IsLast(p,L))
    {
        /*如果不用TmpCell需要删除的这个内存块,地址丢失
        p->Next=p->Next->Next;
        free()
        */
        TmpCell=p->Next;
        p->Next=TmpCell->Next;
        free(TmpCell);
    }
}
/*链表的插入例程*/
/*insert X after p*/
void
Insert(List L,ElementType X,Position p)
{
    Position TmpCell;
    TmpCell=(struct Node *)malloc(sizeof(struct Node));
    TmpCell->Element=X;
    TmpCell->Next=p->Next;//先让TepCell指向后面,在让p->Next指向TmpCell,不然会丢失后面的地址
    p->Next=TmpCell;
}

时间: 2024-10-13 00:44:47

链表的声明及操作的相关文章

链表的特有算法操作

10.42 使用list的算法实现排序和删除重复元素. #include<algorithm> #include<list> #include<iostream> #include<string> using namespace std; void elimDup(list<string> &words) { words.sort(); words.unique(); } bool isShorter(const string &

关于链表的一些简单操作

终于上黄金了.. 然后就是一波2连败... 最近 完全不想做题啊  一做题 就想碎觉啊 郁闷死了 根据书本 写了点关于单向链表的简单操作 可能还存在点小bug---先放它一马吧 以后可能再进行补充关于它的操作 毕竟还有好多 先慢慢找回敲键盘打代码的感觉 厌 1 /* 2 线性表之单向链表的一些常见操作 3 */ 4 #include <iostream> 5 using namespace std; 6 7 typedef int ElemType; 8 typedef struct LNod

静态链表的实现与操作(C语言实现)

我们知道要实现单链表,必须要有指针,那么像Java这样没有指针的的语言就略显蛋疼了. 没关系,我们有静态链表,其本质就是用采用数组的方式实现单链表的功能. 头文件: #ifndef _StaticLinkList_H_ #define _StaticLinkList_H_ typedef void StaticLinkList; typedef void StaticLinkListNode; StaticLinkList * StaticLinkList_Create(int capacity

链表的无锁操作 (JAVA)

看了下网上关于链表的无锁操作,写的不清楚,遂自己整理一部分,主要使用concurrent并发包的CAS操作. 1. 链表尾部插入 待插入的节点为:cur 尾节点:pred 基本插入方法: do{ pred = find_tail(); //重新找尾节点 }(! pred.next.compareAndSet(NULL, cur)) //pred.next 是否为NULL,是则将其指向cur,不是则有新的节点插入 这种插入方法是不带标记的,如果不涉及链表删除这个方法是可行的. 但是如果有删除操作,

链表及其各种函数操作的实现方法

代码中主要实现了下面四个操作: 下面几种操作都是线性操作,算法复杂度都是O(n): 链表插入默认是按关键字大小插入链表的,所以最后得到的结果是从大到小排好序的,分三种情况(1)链表为空(2)插入的点最小,插在链表最前面:(3)插入链表中间;(4)插入链表结尾. 链表删除是在链表中找到要删除的关键字,然后删除该节点,如果有两个以上,只删一个.如果没有就返回.删除操作必须释放删除结点所申请的内存: 查找最大理论上就是最后一个,查找最小理论上就是第一个结点.但是我为了通用性写成了遍历整个链表查找最大和

C语言的指针、链表的原理和操作

心得: 堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的.然而要使用c语言这个工具解决实际问题,又必须掌握它.通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定.对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致.学习c语言不能停留在学习它的语法规则,而是利用学到的知识编写c语言程序,解决实际问题.即把c语言作为工具,

单链表反转的图示操作

有一个线性表$(a_1,a_2, \cdots, a_n)$, 采用带头结点的单链表$L$存储,设计一个算法将其就地逆置.所谓“就地”指辅助空间为$O(1)$. 解答:用$p$指针扫描原单链表,先将头结点$L$的$next$域置为$NULL$而变成一个空链表,然后,将$*p$结点采用头插法插入到$L$中.算法如下: 1 void Reverse(LinkList *&L){ 2 LinkList *p=L->next,*q; 3 L->next=NULL; 4 while (p!=NU

关于链表的一些重要操作(Important operations on a Linked List)

上篇博文中讨论了链表的一些基本操作: 链表的基本操作(Basic Operations on a Linked List) 然而,为创建一个多功能的链表,在深度学习之前我们还需要了解更多的链表操作. 在表头插入元素. 在表中插入元素. 在确定的位置插入. 在某个元素的后面插入. 从链表中删除一个元素. 删除整个链表. 在链表头部插入元素 为了在链表头部插入元素,我们要完成一项小任务:创建一个临时节点,把数据存入这个临时节点,将这个节点指向链表的头节点. /* Defining a functio

单链表 - 插入和删除操作

下图展示了单链表的基本结构: head指针是链表的头指针,指向第一个节点,每个节点的next指针域指向下一个节点,最后一个节点的next指针域为NULL,在图中用0表示. 下面先来看程序(栈的链式存储实现,另外一个实现点这里)和对应的输出(注意输出前进行了链表反转(见<单链表反转>,否则程序后面的while循环输出的顺序是250,200,100),接着来分析程序: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22