数据结构(C实现)------- 单链表

在单链表中,每一个结点包含两部分:存放每一个数据元素本身信息的数据域和存放其直接后继存储位置的指针域。

单链表结点的类型描述:

typedef int ElemType;
typedef struct node{
	ElemType data;
	struct node *next;
}LNode,*LinkList;

单链表的存取必须从头指针开始进行,因此,通常用头指针来标识一个单链表。若头指针为空,则表示空链表。有时,在单链表的第一个结点之前附设一个结点,称之为头结点。

单链表的操作:

1. 单链表的初始化Init_LinkList()

单链表的初始化是建立带头结点的空链表

//初始化运算
LinkList Init_LinkList(){
	LinkList L;
	L = (LinkList)malloc(sizeof(LNode));
	L->next=NULL;
	return L;
}

2.   求单链表的长度Length_LinkList(LinkList L)

//求表长运算
int Length_LinkList(LinkList L){
	LinkList p;
	int length = 0;
	p = L->next;//p指向第一个结点
	while(p){
		length++;
		p = p->next;
	}
	return length;
}

3.  按序号查找单链表Locate_LinkList_BySeq(LinkList L,int i)

从链表的头指针出发,逐个向后扫描,直到扫描到第i个结点为止。

//按序号定位
LinkList Locate_LinkList_BySeq(LinkList L,int i){
	LinkList p = L;
	int j = 0;
	while(j < i && p->next){
		p = p->next;
		j++;
	}
	if(j == i)
		return p;
	else
		return NULL;
}

4. 按值查找单链表Locate_LinkList_ByValue(LinkList L,ElemType e)

从单链表的第i个结点起,顺序扫描单链表,将结点的值和e相比较,直到找到一个和e相等的结点为止,返回该结点的指针;否则,若查遍整个链表找不到这样的结点,则返回空指针。

//按值定位
LinkList Locate_LinkList_ByValue(LinkList L,ElemType e){
	LinkList p = L->next;
	while(p != NULL && p->data != e){
		p = p->next;
	}
	return p;
}

5. 将新结点*s插入到结点*p之后的运算InsertAfter(LinkList p,ElemType e)

//将新结点插入到指定结点之后
void InsertAfter(LinkList p,ElemType e){
	LinkList s;
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
}

6. 将新结点*s插入到结点*p之前InsertBefore(LinkList L,LinkList p,ElemType e)

//将新结点插入到指定结点之前
void InsertBefore(LinkList L,LinkList p,ElemType e){
	LinkList s,q;
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	q = L;
	//找到p的前驱结点
	while(q->next != p)
		q = q->next;

	s->next = p;
	q->next = s;
}

7. 在单链表第i个结点之前插入新结点

//将新结点插入到第i个结点之前
void InsertBefore_Seqi(LinkList L,int i,ElemType e){
	LinkList p,s;
	//找到第i-1个结点
	p = Locate_LinkList_BySeq(L,i-1);
	if(p == NULL)
		printf("i位置不合法");
	else{
		s = (LinkList)malloc(sizeof(LNode));
		s->data = e;
		s->next = p->next;
		p->next = s;
	}
}

8.  在单链表第i个结点之后插入新结点

//将新结点插入到第i个结点之后
void InsertAfter_Seqi(LinkList L,int i,ElemType e){
	LinkList p,s;
	//找到第i个结点
	p = Locate_LinkList_BySeq(L,i);
	if(p == NULL)
		printf("i位置不合法");
	else{
		s = (LinkList)malloc(sizeof(LNode));
		s->data = e;
		s->next = p->next;
		p->next = s;
	}
}

9.  删除*p结点的后继结点DeleteAfter_Nodep(LinkList p)

//删除*p结点的后继结点
void DeleteAfter_Nodep(LinkList p){
	LinkList s;
	if(p->next == NULL)
		printf("当前结点的后继结点为空\n");
	else{
		s = p->next;
		p->next = s->next;
		free(s);
	}
}

10. 删除*p结点DeleteNodep(LinkList L,LinkList p)

//删除指定结点
void DeleteNodep(LinkList L,LinkList p){
	LinkList q;
	q = L;
	//找到*p的前驱结点
	while(q->next != p)
		q = q->next;
	q->next = p->next;
	free(p);
}

11. 删除单链表的第i个结点Delete_Nodei(LinkList L,int i)

//删除单链表的第i个结点
void Delete_Nodei(LinkList L,int i){
	LinkList q,p;
	//找到第i个结点
	q = Locate_LinkList_BySeq(L,i-1);
	if(q == NULL)
		printf("第i-1个结点不存在\n");
	else{
		p = q->next;
		q->next = p->next;
		free(p);
	}
}

12.  删除单链表中所有值为e的结点,并返回值为e的结点的个数Delete_Node_Valuee(LinkList L,ElemType e)

//删除单链表中所有值为e的结点,并返回值为e的结点的个数
int Delete_Node_Valuee(LinkList L,ElemType e){
	LinkList q,p;
	int count = 0;
	q = L;
	while(q->next != NULL){
		p = q->next;
		if(p->data == e){
			q->next = p->next;
			free(p);
		}
		else
			q = p;
	}
	return count;
}

13. 输出单链表Print_LinkList(LinkList L)

//打印链表
void Print_LinkList(LinkList L){
	LinkList p = L->next;
	while(p){
		printf("%d\t",p->data);
		p = p->next;
	}
	printf("\n");
}

14. 头插法建立单链表Create_LinkListF(int n)

//头插法建立单链表
LinkList Create_LinkListF(int n){
	LinkList L,s;
	int i,x;
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	for(i=n;i>0;i--){
		scanf("%d",&x);
		s = (LinkList)malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next;
		L->next = s;
	}
	return L;
}

15.  尾插法建立单链表Create_LinkListR(int n)

//尾插法建立单链表
LinkList Create_LinkListR(int n){
	LinkList L,s,p;
	int i,x;
	L = (LinkList)malloc(sizeof(LNode));
	p = L;
	for(i = n;i > 0;i--){
		scanf("%d",&x);
		s = (LinkList)malloc(sizeof(LNode));
		s->data = x;
		p->next = s;
		p = s;
	}
	p->next = NULL;
	return L;
}
时间: 2024-08-09 10:14:20

数据结构(C实现)------- 单链表的相关文章

PHP数据结构之实现单链表

学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $next; public function __construct($id,$name) //构造函数 { $this->id=$id; $this->name=$name; $this->next=null; } } class linklist //链表的数据结构 { private $he

数据结构学习之单链表基本操作

数据结构学习之单链表基本操作 0x1 前言 今天实验课,学习了下单链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的单链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)释

数据结构之_单链表的实现

数据结构之_单链表的实现 1.基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 单链表 线性表的链式存储结构中,每个节点中只包含一个指针域,这样的链表叫单链表. 通过每个节点的指针域将线性表的数据元素按其逻辑次序链接在一起(如图). 概念解释: 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息 数据结点 链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息

【数据结构】顺序存储单链表

数据结构之单链表的顺序存储实现 闲来无事,回顾下以前学过的数据结构,写个玩玩,理论的东西就不多说了,网上一搜一大堆: 重要的是需要掌握这种数据结构的思想,整个数据结构这门课最重要的也是思想! 下面是代码: //====================================================================== // // Copyright (C) 2014-2015 SCOTT // All rights reserved // // filename:

厦门大学数据结构期末考试单链表问题

因为过几天要去参加厦门大学的夏令营,提前刷了下厦门大学往年的期末考试试卷. 卷中有这么一道题目: 有一个单链表,其结点的元素值以递增顺序排列,给出数据结构,并编写一个算法删除该单链表中元素值相同的结点. 算法如下: 从头到尾扫描单链表,若当前结点和后继结点的值不相同,则指针后移,若相同,则删除该后继结点. 1 #include "stdio.h" 2 3 typedef struct Node{ 4 int data; 5 struct Node *next; 6 }Node, *Li

数据结构基础(8) --单链表的设计与实现(1)之基本操作

链表简介 数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删除:除了在数组的末尾删除元素之外,在数组的其他任何位置删除元素都需要进行数组元素的频繁移动(删除位置之后的元素都需往前移动), 时间复杂度也为O(N); 链表的特点: 由于在链表中插入/删除元素都不需要进行数据的移位, 只需要O(1)时间完成, 因此链表适用于频繁插入与删除的情况; 但是链表也有缺点

【C语言数据结构】循环单链表

CircleLinkList.h #ifndef CIRCLE_LINK_LIST #define CIRCLE_LINK_LIST //链表节点 typedef struct _CircleLinkListNode {     struct _CircleLinkListNode *next; }CircleLinkListNode; //循环单链表 typedef void CircleLinkList; /*  * 创建循环单链表  * @return 返回循环单链表的指针  */ Cir

【C语言数据结构】静态单链表

StaticLinkLinst.h #ifndef STATIC_LINKLIST_H #define STATIC_LINKLIST_H typedef void StaticLinkListNode;    //静态单链表节点 typedef void StaticLinkList;        //静态单链表 /*  * 创建静态单链表  * @param capacity 静态单链表的最大容量  * @return 返回静态单链表的指针  */ StaticLinkList* Stat

C++ 数据结构学习二(单链表)

模板类 //LinkList.h 单链表#ifndef LINK_LIST_HXX#define LINK_LIST_HXX#include <iostream>using namespace std; template<class T>struct Node{ T data; Node * next;}; template<class T>class LinkList{ public: LinkList(); //无参构造函数,建立只有头结点的空链表 LinkList

数据结构 线性表—单链表

本文只要实现单链表的初始化.插入(尾插.头插.任意位置插入).删除(尾删.头删.删除指定元素).查找等. 定义单链表 typedef int DataType; typedef struct LinkNode {  DataType data;  struct LinkNode *next; }LinkNode, *pLinkNode, *pList; 实现单链表的所有接口: void InitLinkList(pList* pHead);//单链表的初始化 void Destroy(pList