上篇博文中讨论了链表的一些基本操作:

然而,为创建一个多功能的链表,在深度学习之前我们还需要了解更多的链表操作。

  • 在表头插入元素。
  • 在表中插入元素。
    • 在确定的位置插入。
    • 在某个元素的后面插入。
  • 从链表中删除一个元素。
  • 删除整个链表。

在链表头部插入元素

为了在链表头部插入元素,我们要完成一项小任务:创建一个临时节点,把数据存入这个临时节点,将这个节点指向链表的头节点。

/*
Defining a function to add an element at the beginning of the Linked List
*/
struct node * addAtBeg(struct node * head, int number)
{
//making a temporary node
struct node * temp = (struct node*)malloc(sizeof(struct node)); //assigning the necessary values
temp -> data = number;
temp -> next = head; //we make the new node as the head node and return
return temp;
}

在链表的特定位置插入数据

依然创建临时节点,把要插入的数据存入这个节点。将临时节点指向指定位置(假定指定位置在两个节点中间)的下个节点,把指定位置上个节点指向临时节点。

/*Defining a function to add at a particular position in a Linked List*/
struct node * addAtPos(struct node *head, int number, int pos)
{
//this is our initial position
int initial_pos = ; //This is a very important statement in all Linked List traversals
//Always create some temporary variable to traverse the list.
//This is done so that we do not loose the starting point of the
//Linked List, that is the HEAD
struct node * mover = head; while(initial_pos != pos)
{
//we need to traverse the Linked List, until
//we reached the userdefined position
mover = mover -> next; //incrementing initial position
initial_pos++;
} //Now mover points to the user defined position //Create a temporary node
struct node * temp = (struct node*)malloc(sizeof(struct node));
temp -> data = number; //Inserting the node.
temp -> next = mover -> next;
mover -> next = temp; return head;
}

在指定节点后插入数据

整个过程其实和上面的一样,唯一的区别是我们需要遍历整个链表找到指定节点,然后执行过程大同小异。

/*
Defining a function to insert after a specified node
*/
struct node * addAfterNode(struct node * head, int number, int after_num)
{
//creating a temporary node to iterate
struct node * mover = head; while(mover -> data != after_num)
{
// We need to iterate until we reach the desired node
mover = mover -> next;
} //Now mover points at the node that we want to insert struct node *temp = (struct node*)malloc(sizeof(struct node));
temp -> data = number;
temp -> next = mover -> next;
mover -> next = temp; return head;
}

删除节点

删除节点,我们需要遍历链表找到要删除的节点。删除节点不需要什么高级的操作,只要将被删除节点的前个节点的next指向被删除节点的下个节点就完成了。

/*
Defining a function to delete a node in the Linked List
*/
struct node * deleteANode(struct node * head, int node_data)
{
//In this function we will try to delete a node that
//has the particular node data given by the user struct node * mover = head; //Creating a variable to store the previous node
struct node * prev; while(mover -> data != node_data)
{
prev = mover;
mover = mover -> next;
} //Now mover point to the node that we need to delete
//prev points to the node just before mover. //Deleting the node mover
prev -> next = mover -> next; return head;
}

删除整个链表

简单清空HEAD就能删除整个链表,但数据仍然在内存中,只是丢失对它的连接。要彻底删除我们可以用free()函数。

/*
Defining a function to delete the entire List
*/
struct node * deleteList(struct node * head)
{
struct node * temp; while(head != NULL)
{
temp = head;
head = head -> next;
free(temp);
} return NULL;
}

完整代码如下:

#include<stdio.h>
#include<stdlib.h> //creating the basic structure of a node of a Linked List
struct node
{
int data;
struct node * next;
}; /*
Code obtained from http://www.studyalgorithms.com
*/
/* Defining a function to create a new list.
The return type of the function is struct node, because we will return the head node
The parameters will be the node, passed from the main function.
The second parameter will be the data element.
*/
struct node * createList(struct node *head,int number)
{
//creating a temporary node for our initialization purpose //the below line allocates a space in memory that can hold the data in a node.
struct node *temp = (struct node *)malloc(sizeof(struct node)); //assigning the number to data
temp -> data = number; //assigning the next of this node to NULL, as a new list is formed.
temp -> next = NULL; //now since we have passed head as the parameter, we need to return it.
head = temp;
return head;
} /*
Defining a case when we need to element in the Linked List.
Here 2 cases can arise:-
-The Linked List can be empty, then we need to create a new list
-The Linked List exists, we need to add the element
*/
struct node * addElement(struct node *head, int number)
{
if(head == NULL)
head = createList(head, number); // we can directly call the above function
else
{
// now this is a case when we need to add an element to an existing list. //Creating a new node and assigning values
struct node * temp = (struct node*)malloc(sizeof(struct node));
temp -> data = number;
temp -> next = NULL; //Now we have created the node but, we need to insert it at the right place.
//A Linked List terminates when we encounter a NULL
//Feel free to copy but please acknowledge studyalgorithms.com
//Let us traverse the List using another temporary variable.
//We will point it to the start
struct node * temp2 = head; //The limiting condition of the while loop "until temp2's NEXT is not equal to NULL
//This will happen only in case of the last node of the list.
while(temp2 -> next != NULL)
{
// We need to go to the next node
temp2 = temp2 -> next;
} //Now temp2 points at the last node of the list.
//We can add the node at this position now. temp2 -> next = temp; // the number is added to the end of the List.
} return head; // because we only need the HEAD pointer for a Linked List.
} /*
A function to print the Linked List.
The return type of this function will be void, as we do not need to return anything.
We just need the HEAD as the parameter, to traverse the Linked List.
*/
void printList(struct node * head)
{
printf("\nThe list is as:- \n");
// The terminating point of a Linked List is defined when we encounter a NULL
while(head != NULL)
{
printf("%d ",head->data); //now we need to move to the next element
head = head->next;
//Feel free to copy but please acknowledge studyalgorithms.com
}
printf("\n");
} /*
Defining a function to add an element at the beginning of the Linked List
*/
struct node * addAtBeg(struct node * head, int number)
{
//making a temporary node
struct node * temp = (struct node*)malloc(sizeof(struct node)); //assigning the necessary values
temp -> data = number;
temp -> next = head; //we make the new node as the head node and return
return temp;
} /*Defining a function to add at a particular position in a Linked List*/
struct node * addAtPos(struct node *head, int number, int pos)
{
if(head == NULL)
{
printf("\nList is EMPTY");
return NULL;
}
//this is our initial position
int initial_pos = ; //This is a very important statement in all Linked List traversals
//Always create some temporary variable to traverse the list.
//This is done so that we do not loose the starting point of the
//Linked List, that is the HEAD
struct node * mover = head; while(initial_pos != pos)
{
//we need to traverse the Linked List, until
//we reached the userdefined position
mover = mover -> next; //incrementing initial position
initial_pos++;
//Feel free to copy but please acknowledge studyalgorithms.com
} //Now mover points to the user defined position //Create a temporary node
struct node * temp = (struct node*)malloc(sizeof(struct node));
temp -> data = number; //Inserting the node.
temp -> next = mover -> next;
mover -> next = temp; return head;
} /*
Defining a function to insert after a specified node
*/
struct node * addAfterNode(struct node * head, int number, int after_num)
{
if(head == NULL)
{
printf("\nList is EMPTY");
return NULL;
} //creating a temporary node to iterate
struct node * mover = head; while(mover -> data != after_num)
{
// We need to iterate until we reach the desired node
mover = mover -> next;
} //Now mover points at the node that we want to insert struct node *temp = (struct node*)malloc(sizeof(struct node));
temp -> data = number;
temp -> next = mover -> next;
//Feel free to copy but please acknowledge studyalgorithms.com
mover -> next = temp; return head;
} /*
Defining a function to delete a node in the Linked List
*/
struct node * deleteANode(struct node * head, int node_data)
{
if(head == NULL)
{
printf("\nList is EMPTY");
return NULL;
} //In this function we will try to delete a node that
//has the particular node data given by the user struct node * mover = head; //Creating a variable to store the previous node
struct node * prev; while(mover -> data != node_data)
{
prev = mover;
mover = mover -> next;
} //Now mover point to the node that we need to delete
//prev points to the node just before mover. //Deleting the node mover
prev -> next = mover -> next; return head;
} /*
Defining a function to delete the entire List
*/
struct node * deleteList(struct node * head)
{
if(head == NULL)
{
printf("\nList is EMPTY");
return NULL;
} struct node * temp; while(head != NULL)
{
temp = head;
head = head -> next;
free(temp);
} return NULL;
} //Defining the main function to implement all the above defined functions
int main(void)
{
int choice = ;
int flag = ;
int num;
int pos; struct node *listHead = NULL; while(flag != )
{
printf("\nWhat do you want to do?\n1.>Create a List\n2.>Add an element at the end\n3.>Add an element at the beginning\n4.>Add an element at a position\n5.>Add an element after a certain element\n6.>Delete at node.\n7.>Print the List\n8.>Delet the List\n9.>Exit.\n\nEnter choice:- ");
scanf("%d",&choice); switch(choice)
{
case :
printf("Enter a number:- ");
scanf("%d",&num);
listHead = createList(listHead, num);
//Feel free to copy but please acknowledge studyalgorithms.com
printList(listHead);
break; case :
printf("Enter a number:- ");
scanf("%d",&num);
listHead = addElement(listHead, num);
printList(listHead);
break; case :
printf("Enter a number:- ");
scanf("%d",&num);
listHead = addAtBeg(listHead, num);
printList(listHead);
break; case :
printf("Enter a number:- ");
scanf("%d",&num);
printf("Enter a position:- ");
scanf("%d",&pos);
listHead = addAtPos(listHead, num, pos);
printList(listHead);
break; case :
printf("Enter a number:- ");
scanf("%d",&num);
printf("Enter a node:- ");
scanf("%d",&pos);
listHead = addAfterNode(listHead, num, pos);
printList(listHead);
break; case :
printf("Enter a node to delete:- ");
scanf("%d",&num);
listHead = deleteANode(listHead, num);
printList(listHead);
break; case :
printList(listHead);
break; case :
listHead = deleteList(listHead);
break; case :
flag = ;
break; default:
printf("Invalid choice\n");
//Feel free to copy but please acknowledge studyalgorithms.com
break;
}
} return ;
}

关于链表的一些重要操作(Important operations on a Linked List)的更多相关文章

  1. 链表的基本操作(Basic Operations on a Linked List)

    链表可以进行如下操作: 创建新链表 增加新元素 遍历链表 打印链表 下面定义了对应以上操作的基本函数. 创建新链表 新链表创建之后里面并没有任何元素,我们要为数据在内存中分配节点,再将节点插入链表.由 ...

  2. 数据结构之链表-链表实现及常用操作(C++篇)

    数据结构之链表-链表实现及常用操作(C++篇) 0.摘要 定义 插入节点(单向链表) 删除节点(单向链表) 反向遍历链表 找出中间节点 找出倒数第k个节点 翻转链表 判断两个链表是否相交,并返回相交点 ...

  3. 链表的无锁操作 (JAVA)

    看了下网上关于链表的无锁操作,写的不清楚,遂自己整理一部分,主要使用concurrent并发包的CAS操作. 1. 链表尾部插入 待插入的节点为:cur 尾节点:pred 基本插入方法: do{ pr ...

  4. 【线性代数】2-4:矩阵操作(Matrix Operations)

    title: [线性代数]2-4:矩阵操作(Matrix Operations) toc: true categories: Mathematic Linear Algebra date: 2017- ...

  5. C++实现链表的相关基础操作

    链表的相关基础操作 # include <iostream> using namespace std; typedef struct LNode { int data; //结点的数据域 ...

  6. C++中单链表的建立和操作

    准备数据 准备在链表操作中需要用到的变量及数据结构 示例代码如下: struct Data //数据结点类型 { string key; //关键字 string name; int age; }; ...

  7. C语言描述链表的实现及操作

    一.链表的创建操作 // 操作系统 win 8.1 // 编译环境 Visual Stuido 2017 #include<stdio.h> #include<malloc.h> ...

  8. 5.List链表类型介绍和操作

    数据类型List链表 (1)介绍 list类型其实就是一个双向链表.通过push,pop操作从链表的头部或者尾部添加删除元素.这使得list既可以用作栈,也可以用作队列. 该list链表类型应用场景: ...

  9. C++学习---单链表的构建及操作

    #include <iostream> using namespace std; typedef struct LinkNode { int elem;//节点中的数据 struct Li ...

随机推荐

  1. hdu2089:不要62(基础数位dp)

    题意:规定一个合法的号码不能含有4或者是连续的62 给定区间[n,m] 问此区间内合法的号码的个数 分析:数位dp dp[i][j]代表 最高位为 j 的 i 位数有多少个合法的 然后按题目规则进行转 ...

  2. [置顶] 单片机C语言易错知识点经验笔记

    今天写这一篇文章并不是因为已经想好了一篇文章才写下来,而是我要将这一篇文章作为一个长期的笔记来写,我会一直更新.在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点 ...

  3. 自定义checkbox样式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. SRM 588 D2 L3:GameInDarknessDiv2,DFS

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12710 采用DFS搜索,第一次写的时候忘了加访问标志,结果状态 ...

  5. 字符串匹配之horspool算法(简化的BM算法)

    前面介绍在BF,KMP这些算法的时候老是提到BM这个东西,究竟这什么东西,有啥高深的,这些问题我们如今不去考虑.不知道,认真读前几篇文章的读者有没有发现前面的算法都是从模式串的前面開始匹配的,那我们就 ...

  6. const与define的异同

    1. DEFINE是预处理指令,是简单的文字替换:而const是关键字,用于变量声明的修饰. 2. DEFINE替换的结果可以是数值.表达式.字符串.甚至是一个程序:而const只能限定变量为不可修改 ...

  7. android 中文件加密 解密 算法实战

    现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多.防止有人交一份钱,把所有的课件就拷给了别人.这样的事情培训机构肯定是不愿意的.现在我项目里 ...

  8. oracle监听

    启动实例时,监听程序进程会建立一个指向Oracle DB 的通信路径.随后,监听程序可接受数据库连接请求.使用监听程序控制实用程序可控制监听程序.使用lsnrctl,可以:• 启动监听程序• 停止监听 ...

  9. mysqldump备份原理

    现网中数据库运维时,要经常对数据库做热备.为保证恢复时数据的完整性与一致性, 一种方法是在备份之前锁表,但锁表会影响正在运行的业务. mysqldump是当前MySQL中最常用的备份工具,通过mysq ...

  10. ajax例子

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...