美文网首页C语言进阶C语言C++
链表的实用操作函数

链表的实用操作函数

作者: Leon_Geo | 来源:发表于2017-06-14 16:49 被阅读25次

单向链表的操作

/*链表节点声明*/

typedef struct listnode *listpointer;

struct listnode {

    int date;

// element else

    listpointer link;

}listnode;

1/ 反转 invert

listpointer invert ( listpointer lead)

{ /* invert the list pointed to by Lead * /

listPointer middle, trail;

middle = NULL;

white (Iead) {

trail = middle;

middle = lead;

Iead = lead->link;

middle->link = trail;

}

return middle;

}

2/连接 concatenate

/* produce a new list that contains the list ptr1 followed by the

Iist ptr2. The list pointed to by ptr1 was changed permanently */

listpointer concatenate(listpointer ptr1, listpointer ptr2)

{

Iistpointer temp ;

/* check for empty lists */

if ( !ptr1) return ptr2 ;

if (!ptr2) return ptr1 ;

/* neither list is empty, find end of first list */

for (temp=ptr1; temp->Iink; temp=lemp->Iink) ;

/* link end of first list to start of second */

temp->link = ptr2;

}

循环链表的操作

1/ 循环链表表头插入

last指向表尾,而不指向表头。这样设置链表指针可以方便地在表头、表尾插入结点。如杲设置指向表头的指针,那么在表头前插入结点效率极低,我们必须从头遍历整个链表,直 到指针移到表尾,然 后才能在表头前插入。

下面的代码在循环链表表头插入结点。

/* insert node at the front of the circular list whose last node is

last * /

void insertFront (listPointer *last, listPointer node)

{

/* list is empty, change Last to point to new entry */

if (!(*Iast)) {

*last = node;

node->Iink = node;

}

else {

/* list is not empty, add new entry at front */

node->Iink = (*last) ->link;

(*last) ->link = node;

}

}

2/ 循环链表表尾插入

/* insert node at the end of the circular list whose last node is

last * /

void insertend (listPointer *last, listPointer node)

{

/* list is empty, change Last to point to new entry */

if (!(*Iast)) {

*last = node;

node->Iink = node;

}

else {

/* list is not empty, add new entry at end */

node->Iink = (*last) ->link;

(*last) ->link = node;

(*last) = node;

}

}

3/ 循环链表的长度

int length (listpointer last )

{ /* find the length of the circular list last */

listpointer temp;

int count = 0;

if (last) {

  temp = Iast;

  do{

        count++;

        temp = temp->link;

  }while (temp!=last);

}

return count;

}

双向链表的操作

      双向链表的结点至少有三个域,数据域 data,左链域 llink,右链域 rlink,结点声明 如下:

typedef struct node *nodepointer;

struct node {

    element data;

    nodepointer llink;

    nodepointer rlink;

};

注: 双向链表也可以设成循环表,包括一个空表头。

‌1. 插入

      函数 dinsert完成插入操作,node足 表中纣i点,可 以足头结点,也可以楚内点,newnode是待插入结点。

void dinsert (nodepointer node, nodepointer newnode)

{ /* insert newnode to the right of node */

newnode->Ilink = node;

newnode ->rIink = node ->rlink ;

node->rlink->llink = newnode;

node->rlink = newnode;

}

‌2.删除

void ddelete (nodePointer head, nodePointer deleted)

{ /*delete the node of 'deleted' with the first null_node of head*/

if (node==deleted)

    printf ("Delete the only node of head is          not permites");

else {

    deleted->llink->rIink = deleted->rIink;

    deleted->rIink->llink = deleted->IIink;

    free (deleted) ;

  }

}

相关文章

  • 链表的实用操作函数

    单向链表的操作 /*链表节点声明*/ typedef struct listnode *listpointer; ...

  • JS 实现链表

    Node 为创建节点的构造函数;LinkedList 为链表操作函数的构造函数。对链表的操作包括:插入节点、移除节...

  • 系统编程(3)

    使用链表实现进出排队系统 链表的函数的声明 对于链表头文件各种操作具体功能的实现

  • sql自学笔记(二十六)——MySQL8.0版本的新特性(十六)

    JSON增强 内联路径操作符 JSON聚合函数 JSON实用函数 JSON合并函数 JSON表函数 内联路径操作符...

  • 4.单链表操作

    单链表的操作,包含增删改查 定义了几个函数: 用于创建新的链表,并返回链表头 用于向已经创建的非空链表的尾部添加一...

  • golang标准库之path

    path实现了对斜杠分隔("/")的路径的实用操作函数。

  • Linux内核链表之共享双链表

    说明 共享双链表意义在于,可以用一套函数维护不同数据类型的双链表 准备 定义双链表 定义结构体 操作 初始化 尾插...

  • 链表复习(二)

    删除链表函数: 反转链表函数: 循环链表: 注意head代表头结点,也代表尾节点

  • 链表

    文章结构 链表的定义 链表的插入和删除操作 链表的特性 常见的链表结构 自定义链表 链表的经典操作 使用链表实现L...

  • 线性表的链式存储-单链表

    单链表操作 [x] 单链表的创建(尾插法、头插法) [x] 单链表的查找操作 [x] 单链表的删除操作 [x] 单...

网友评论

    本文标题:链表的实用操作函数

    本文链接:https://www.haomeiwen.com/subject/cdqeqxtx.html