一、单向链表
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
//#include "link.h"
typedef struct NODE
{
struct NODE *link;
int value;
}Node;
//createNode()
Node * createNode(int value)
{
Node *node;
node = (Node*)malloc(sizeof(Node));
if(node!=NULL)
{
node->value = value;
node->link = NULL;
}
else
{
printf("Not Enough Memory!\n");
}
}
//sortinsert()
int sortInsert(register Node**linkp,int new_value)
{
register Node *current;
register Node *new;
while((current = *linkp)!=NULL && current->value<new_value)
linkp = ¤t->link;
new = (Node*)malloc(sizeof(Node));
if(new == NULL)
return FALSE;
new->value = new_value;
new->link = current;
*linkp = new ;
return TRUE;
}
//freeLinkList()
void freeLinkList(Node * head)
{
if(head == NULL)
{
printf("\n Empty memory! \n");
return;
}
Node *ptr = head;
Node * curr;
while(ptr->link != NULL)
{
curr = ptr;
ptr = ptr->link;
free(curr);
}
free(ptr);
}
//printLinkList()
void printLinkList(Node * head)
{
if(head == NULL)
return;
while(head->link != NULL)
{
head = head->link;
printf("%d -> ",head->value);
}
putchar('\n');
}
//main()
int main(int argc, char *argv[])
{
Node * head;
head = (Node*)malloc(sizeof(Node));
int i;
for(i=0;i<10;i++)
{
Node * newNode = createNode(i);
newNode->link = head->link;
head->link = newNode;
}
printLinkList(head);
sortInsert(&head->link,13);
sortInsert(&head->link,10);
printLinkList(head);
freeLinkList(head);
system("PAUSE");
return 0;
}
二、双向链表
#include<stdio.h>
#include<stdlib.h>
#define FALSE 0
#define TRUE 1
typedef struct NODE
{
struct NODE *fwd;
struct NODE *bwd;
int value;
}Node;
//插入节点
int dll_insert(register Node * rootp,int value)
{
register Node * this;
register Node * next;
register Node * newnode;
for(this =rootp;(next = this->fwd)!=NULL;this = next)
{
if(next->value == value)
return FALSE;
if(next->value > value)
break;
}
newnode = (Node*)malloc(sizeof(Node));
if(newnode == NULL)
return -1;
newnode->value = value;
/*插入新节点*/
newnode->fwd = next;
this->fwd =newnode;
newnode->bwd = this != rootp ? this : NULL;
(next != NULL ? next:rootp)->bwd = newnode;
return 1;
}
//打印链表
void printLinklist(Node * rootp)
{
if(rootp == NULL)
return;
Node * temp = rootp;
while(temp->fwd != NULL)
{
temp = temp->fwd;
printf("%d->",temp->value);
}
printf("NULL\n");
}
//释放链表空间
void freeLinkList(Node * rootp)
{
if(rootp == NULL)
{
printf("\n Empty memory! \n");
return;
}
Node *ptr = rootp;
Node * curr;
while(ptr->fwd != NULL)
{
curr = ptr;
ptr = ptr->fwd;
free(curr);
}
free(ptr);
}
//main
int main(int argc, char *argv[])
{
Node * rootp;
rootp = (Node*)malloc(sizeof(Node));
rootp->bwd = NULL;
rootp->fwd = NULL;
int i;
for(i=0;i<10;i++)
{
dll_insert(rootp,i);
}
printLinklist(rootp);
freeLinkList(rootp);
system("PAUSE");
return 0;
}
分享到:
相关推荐
本资源提供的是针对初学者设计的链表学习材料,包括单向链表和双向链表的实现。下面将详细讲解这两种链表的数据结构及其操作。 1. **单向链表**: 单向链表是一种线性数据结构,每个节点包含两部分:数据域和指针...
本主题将深入探讨由C语言实现的单向链表(slist.h)和双向链表(blist)。这两种链表各有特点,适用于不同的场景,对于理解和掌握数据结构与算法至关重要。 ### 单向链表(slist.h) 单向链表是一种线性数据结构,...
本文将深入探讨C语言实现的双向链表和双向循环链表,以及如何将这些概念应用于Linux内核。双向链表与单向链表相比,具有更灵活的操作特性,而双向循环链表则在此基础上增加了循环的特性,使得遍历和操作更加方便。 ...
在实现过程中,我们看到有"Main.cpp"作为主程序入口,负责调用其他模块,如"LinearListLink.cpp"和"DoubleListLink.cpp"分别实现了单向链表和双向循环链表的相关操作。"PlaneData.dat"可能是存储航班数据的二进制...
在本案例中,我们将深入探讨单向链表和双向链表的概念,以及它们在C语言中的实现。 单向链表是由一系列节点组成,每个节点包含两个部分:数据域和指针域。数据域用于存储实际的数据,而指针域则指向下一个节点。...
本文将详细介绍如何使用C语言实现单向链表的创建、输入和输出。 #### 单向链表的基本概念 单向链表是一种线性表,其中每个元素(节点)包含一个数据域和一个指向其后继节点的指针域。单向链表的主要特点是节点只能...
本资源“C语言实现通用双向链表标准版.rar”提供了一个使用C语言实现的通用双向链表实例,这对于理解和掌握数据结构,尤其是链表操作具有重要意义。 双向链表是一种线性数据结构,与单向链表不同,它允许节点在两个...
链表实现(单向链表、顺序表、双向链表、循环链表)的相关代码
在本项目中,"C语言链表课程设计——仓库管理系统.rar"是一个基于C语言实现的仓库管理系统的源代码压缩包。这个系统利用了链表数据结构来存储和管理仓库中的物品信息,包括入库、出库、查询等操作。链表是计算机科学...
`LinkedList.c`和`LinkedList.h`中应该包含了Intel如何使用C语言实现双向链表的详细代码,包括节点定义、链表初始化、添加和移除节点等功能。 C语言是系统编程和嵌入式开发中的常用语言,其特性允许直接操作内存,...
在"第一、二章"的压缩文件中,很可能包含了实现单向链表和双向链表操作的C、C++、Java或Python等语言的源代码示例。这些示例程序可能涉及了初始化链表、插入新节点、删除指定节点、查找特定元素、打印链表内容等功能...
双向链表(Double-Linked List)是一种数据结构,它与单向链表相似,但每个节点不仅包含指向下一个节点的指针,还包含一个指向前一个节点的指针。这种设计使得在链表中的前进和后退操作同样高效,而单向链表只能从前...
本文将深入探讨如何使用C语言来实现单向链表,并扩展到实现双向链表的“增删改查显”功能。 首先,让我们了解链表的基本概念。链表是一种线性数据结构,与数组不同,它在内存中不是连续存储的。每个链表节点包含两...
链表分为单向链表、双向链表和循环链表,这里提到的链表可能是单向链表,因为没有提及反向指针。 2. **文件功能**: - `main.c`:主程序,负责调用其他功能函数并实现交互式菜单。 - `CreateHead.c`:创建链表头...
C语言链表相关的面试题在软件开发领域的面试中是非常常见的,这是因为链表作为一种基本的数据结构,对于理解数据结构、算法以及内存管理等方面有着重要的作用。以下是一些关于C语言链表的面试题及其详细解释。 1. ...
与单向链表相比,双向链表允许双向遍历,即可以从前往后也可以从后往前访问元素,增加了数据操作的灵活性。 在实现双向链表时,我们需要定义一个节点结构体,通常包含三个部分:数据域、前驱指针和后继指针。数据域...
本资源是关于用C语言实现双向链表的源代码,非常适合初学者理解和学习。 首先,我们要了解双向链表的基本结构。每个节点通常包含三个部分:数据域(用于存储实际数据)、前向指针(指向下一个节点)和后向指针...
与单向链表不同,双向循环链表的每个节点都有两个指针,一个指向其前一个节点,另一个指向其后一个节点。这种结构在实现队列、栈和其他高级数据结构时非常有用。 双向循环链表的主要优点在于它的灵活性。由于我们...
总结来说,本示例中,我们利用C语言的宏定义实现了模板化的单双向链表,提供了创建、插入和删除节点的通用方法。这使得我们可以在不同场景下灵活地使用链表数据结构,而不必为每种数据类型编写单独的代码。
数组、单链表和双链表介绍以及双向链表的C、C++和Java实现 在计算机科学中,数组、单链表和双链表是最基本的数据结构。它们都是线性表的实现方式,具有相同类型的n(n≥0)个数据元素组成的有限序列。 数组 数组是...