C实现单链表的常见功能

以下是本次实现的一些功能:

///////////////////////////////////////////////////////////////////////////////

普通功能的实现:

void InitLinkList(pList* pHead);

void Destroy(pList *pHead);

void PushBack(pList* pHead, DataType x);

void PopBack(pList* pHead);

void PushFront(pList* pHead, DataType x);

void PopFront(pList* pHead);

void PrintList(pList list);

int GetListLength(pList head);

pLinkNode Find(pList head, DataType x);

void Insert(pList *pHead, pLinkNode pos, DataType x);

void Remove(pList *pHead, DataType x);

void RemoveAll(pList *pHead, DataType x);

void Erase(pList *pHead, pLinkNode pos)

///////////////////////////////////////////////////////////////////////////////

常见的笔试问题:

//删除非尾节点-----1

void EraseNotTail(pLinkNode pos);

//反转(逆序)链表--2

void ReverseList(pList* pplist);

//排序链表(冒泡)--3

void BubbleSort(pList * pplist);

// 删除非尾结点----4

void DelNonTailNode(pLinkNode pos);

// 在当前节点前插入一个数据x-----5

void InsertFrontNode(pLinkNode pos, DataType x);

//合并两个有序列表-----6

pLinkNode Merge(pList l1, pList l2);

//查找链表的中间节点---7

pLinkNode FindMidNode(pList head);

// 删除单链表的倒数第k个节点(k > 1 && k < 链表的总长度)----9

// 时间复杂度O(N)

void DelKNode(pList *pplist, int k);

// 【链表带环问题】-----10

// 判断链表是否带环, 若链表带环则求环的长度和相遇节点,不带环返回-1

pLinkNode CheckCycle(pList pList);

int GetCircleLength(pLinkNode meet);

//FindEntryNode()

// 获取环入口点

pLinkNode GetCycleEntryNode(pList list, pLinkNode meetNode);

// 【链表相交问题】

//

// 判断两个链表是否相交,假设两个链表都不带环。

// 求环的交点,长链表先走n步(n为两链表的长度差),然后再一起走,第一个相遇点则为交点。

//

int CheckCross(pList list1, pList list2);

////////////////////////////////////////////////////////////////////////////////////////


h"
#include<stdio.h>
void test1()//初始化
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);

}
void test2()//打印
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PrintLinkList(pmylinklist);
}
void test3()//尾插
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PrintLinkList(pmylinklist);
}
void test4()//头插
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PushFront(&pmylinklist, 1);
	PushFront(&pmylinklist, 2);
	PushFront(&pmylinklist, 3);
	PushFront(&pmylinklist, 4);
	PrintLinkList(pmylinklist);

}
void test5()//尾删
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PopBack(&pmylinklist);
	PrintLinkList(pmylinklist);

}
void test6()//头删
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PopFront(&pmylinklist);
	PrintLinkList(pmylinklist);
	PopFront(&pmylinklist);
	PrintLinkList(pmylinklist);

}
void test7()//删除链表
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	Destroy(&pmylinklist);
}
void test8()
{
	PlinkList pmylinklist;
	PlinkList ret;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 1);
	ret = Find(pmylinklist, 2);
	if (ret != NULL)
	{
		printf("找到了\n");
	}
	else
	{
		printf("没找到\n");
	}
}
void test9()//删除一个指定元素
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 4);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 1);
	Remove(&pmylinklist, 4);
	PrintLinkList(pmylinklist);

}
void test10()//删除指定元素的全部
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 1);
	RemoveAll(&pmylinklist, 1);
	PrintLinkList(pmylinklist);
}
void test11()//某元素后插入节点
{
	PlinkList pmylinklist;
	PlinkNode pos;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 4);
	pos = Find(pmylinklist, 3);
	Insert(&pmylinklist, pos, 5);
	PrintLinkList(pmylinklist);
}
void test12()//指定位置删除
{
	PlinkList pmylinklist;
	PlinkNode pos;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 4);
	pos = Find(pmylinklist, 3);
	Erase(&pmylinklist, pos);
	PrintLinkList(pmylinklist);

}
void test13()//删除无头非尾部节点
{
	PlinkList pmylinklist;
	PlinkNode pos;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 4);
	pos=Find(pmylinklist, 3);
	EraseNotTail(pos);
	PrintLinkList(pmylinklist);
}
void test14()////获取链表长度
{
	PlinkList pmylinklist;
	PlinkNode pos;
	int ret;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 4);
	ret=GetListLength(pmylinklist);
	printf("%d\n", ret);
}
void test15()//逆序列表
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 4);
	ReverseList(&pmylinklist);
	PrintLinkList(pmylinklist);

}
void test16()//排序链表(冒泡)
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 4);
	BubbleSort(&pmylinklist);
	PrintLinkList(pmylinklist);

}
void test17()//在当前结点前插入一个数据
{
	PlinkNode pos = NULL;
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 4);
	pos = Find(pmylinklist, 4);
	InsertFrontNode(pos,5);
	PrintLinkList(pmylinklist);

}
void test18()//合并两个有序列表
{
	PlinkNode ret;
	PlinkList pmylinklist1;
	PlinkList pmylinklist2;
	InitLinkList(&pmylinklist1);
	PushBack(&pmylinklist1, 1);
	PushBack(&pmylinklist1, 3);
	PushBack(&pmylinklist1, 5);
	PushBack(&pmylinklist1, 7);
	InitLinkList(&pmylinklist2);
	PushBack(&pmylinklist2, 2);
	PushBack(&pmylinklist2, 4);
	PushBack(&pmylinklist2, 6);
	PushBack(&pmylinklist2, 8);
	ret=Merge(pmylinklist1, pmylinklist2);
	PrintLinkList(ret);
}
void test19()//查找链表的中间节点
{
	PlinkList pmylinklist;
	PlinkNode ret;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 4);
	PushBack(&pmylinklist, 5);
	PushBack(&pmylinklist, 6); 
	//PushBack(&pmylinklist, 7);
	ret=FindMidNode(pmylinklist);
	printf("%d\n",ret->Data);
}
void test20()//删除链表的倒数第K个节点
{
	PlinkList pmylinklist;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 4);
	PushBack(&pmylinklist, 5);
	PushBack(&pmylinklist, 6);
	DelKNode(&pmylinklist, 2);
	PrintLinkList(pmylinklist);

}
void test21()//判断链表是否带环
{
	PlinkList pmylinklist;
	PlinkNode pos;
	InitLinkList(&pmylinklist);
	PushBack(&pmylinklist, 2);
	PushBack(&pmylinklist, 1);
	PushBack(&pmylinklist, 3);
	PushBack(&pmylinklist, 4);
	PushBack(&pmylinklist, 5);
	PushBack(&pmylinklist, 6);
	PlinkNode start = Find(pmylinklist, 3);
	PlinkNode end = Find(pmylinklist, 6);
	end->next = start;//构建一个环
	pos=CheckCycle(pmylinklist);//快慢指针在环上的相遇点
	printf("%d\n",pos->Data);
	PlinkNode meet = pos;
	printf("%d\n",GetCycleLength(meet));//得出环的长度
	PlinkNode meetNode;
	meetNode=GetCycleEntry(pmylinklist, meet);//获取环的入口点
	printf("%d\n",meetNode->Data);
}
void test22()//判断两链表是否相交
{
	PlinkList pmylinklist1;
	PlinkList pmylinklist2;
	InitLinkList(&pmylinklist1);
	InitLinkList(&pmylinklist2);
	PushBack(&pmylinklist1, 1);
	PushBack(&pmylinklist1, 3);
	PushBack(&pmylinklist1, 5);
	PushBack(&pmylinklist1, 7);
	PushBack(&pmylinklist1, 9);
	PushBack(&pmylinklist1, 11);
	PushBack(&pmylinklist2, 2);
	PushBack(&pmylinklist2, 2);
	PushBack(&pmylinklist2, 4);
	PushBack(&pmylinklist2, 6);
	PushBack(&pmylinklist2, 8);
	PushBack(&pmylinklist2, 10);
	int ret = CheckCross(pmylinklist1, pmylinklist2);
	if (ret == 1)
	{
		printf("yes\n");
	}
	else
		printf("no\n");
}
int main()
{
	test22();
	system("pause");
	return 0;
}

/**************************************************************************/

#ifndef __LINK_LIST_H__

#define __LINK_LIST_H__

#include<stdio.h>

#include<assert.h>

#include<stdlib.h>

typedef int DataType;

typedef struct LinkNode

{

DataType Data;

struct LinkNode *next;

}LinkNode, *PlinkNode, *PlinkList;

/*****************************************************************/

void InitLinkList(PlinkList *phead);

void PrintLinkList(PlinkList phead);

void PushBack(PlinkList *phead, DataType x);

void PushFront(PlinkList *phead, DataType x);

void PopBack(PlinkList *phead);

void PopFront(PlinkList *phead);

void Destroy(PlinkList *phead);

void Remove(PlinkList *phead, DataType x);

PlinkNode Find(PlinkList phead, DataType x);

void RemoveAll(PlinkList *phead, DataType x);

void Insert(PlinkList *phead, PlinkNode pos, DataType x);

void Erase(PlinkList *phead, PlinkNode pos);

void EraseNotTail(PlinkNode pos);

int GetListLength(PlinkList phead);

void ReverseList(PlinkList *phead);

void BubbleSort(PlinkList *phead);

void InsertFrontNode(PlinkNode pos, DataType x);

PlinkNode Merge(PlinkList phead1, PlinkList phead2);

PlinkNode FindMidNode(PlinkList phead);

void DelKNode(PlinkList *phead, int k);

PlinkNode CheckCycle(PlinkList phead);

int GetCycleLength(PlinkNode meet);

PlinkNode GetCycleEntry(PlinkList phead, PlinkNode meet);

int CheckCross(PlinkList phead1,PlinkList phead2);

/*****************************************************************/

void InitLinkList(PlinkList *phead)//初始化

{

*phead = NULL;

}

void PrintLinkList(PlinkList phead)//打印

{

PlinkNode cur = phead;

assert(phead);

while (cur)

{

printf("%d ", cur->Data);

cur = cur->next;

}

printf("\n");

}

void PushBack(PlinkList *phead, DataType x)//尾插

{

PlinkNode cur = *phead;

assert(phead);

PlinkNode NewNode = (PlinkNode)malloc(sizeof(LinkNode));

NewNode->Data = x;

NewNode->next = NULL;

if (cur == NULL)

{

*phead = NewNode;

return;

}

while (cur->next)

{

cur = cur->next;

}

cur->next = NewNode;

}

void PushFront(PlinkList *phead, DataType x)//头插

{

PlinkNode NewNode;

assert(phead);

NewNode = (PlinkNode)malloc(sizeof(LinkNode));

NewNode->Data = x;

NewNode->next = NULL;

if (*phead == NULL)

{

*phead = NewNode;

return;

}

NewNode->next = *phead;

*phead = NewNode;

}

void PopBack(PlinkList *phead)//尾删

{

PlinkNode cur = *phead;

assert(phead);

if (*phead == NULL)

{

return;

}

else if ((*phead)->next == NULL)

{

free(*phead);

*phead = NULL;

}

else

{

PlinkNode del;

while (cur->next->next)

{

cur = cur->next;

}

del = cur->next;

cur->next = NULL;

free(del);

}

}

void PopFront(PlinkList *phead)//头删

{

PlinkNode cur = *phead;

assert(phead);

if (*phead == NULL)

{

return;

}

else if ((*phead)->next == NULL)

{

free(*phead);

*phead = NULL;

}

else

{

PlinkNode del;

del = *phead;

(*phead) = (*phead)->next;

free(del);

del = NULL;

}

}

void Destroy(PlinkList *phead)//删除链表

{

PlinkNode cur = *phead;

assert(phead);

if (*phead == NULL)

{

return;

}

else

{

while (cur)

{

PlinkNode del = cur;

cur = cur->next;

free(del);

}

}

}

PlinkNode Find(PlinkList phead, DataType x)//查找

{

PlinkNode cur = phead;

while (cur)

{

if (cur->Data == x)

{

return cur;

}

cur = cur->next;

}

return NULL;

}

void Remove(PlinkList *phead, DataType x)//删除一个指定元素

{

PlinkNode prev = NULL;

PlinkNode del = NULL;

PlinkNode cur = *phead;

assert(phead);

while (cur)

{

if (cur->Data == x)

{

del = cur;

if (cur == *phead)

{

*phead = (*phead)->next;

}

else

{

prev->next = cur->next;

del = cur;

}

free(del);

del = NULL;

break;

}

prev = cur;

cur = cur->next;

}

}

void RemoveAll(PlinkList *phead, DataType x)//删除指定元素的全部

{

PlinkNode prev = NULL;

PlinkNode del = NULL;

PlinkNode cur = *phead;

assert(phead);

while (cur)

{

if (cur->Data == x)

{

del = cur;

if (cur == *phead)

{

*phead = (*phead)->next;

cur = (*phead)->next;

}

else

{

prev->next = cur->next;

del = cur;

cur = prev->next;

}

free(del);

del = NULL;

}

else

{

prev = cur;

cur = cur->next;

}

}

}

void Insert(PlinkList *phead, PlinkNode pos, DataType x)//某元素后插入节点

{

PlinkNode NewNode;

assert(phead);

NewNode = (PlinkNode)malloc(sizeof(LinkNode));

NewNode->Data = x;

NewNode->next = pos->next;

pos->next = NewNode;

}

void Erase(PlinkList *phead, PlinkNode pos)//指定位置删除

{

PlinkNode prev = NULL;

PlinkNode cur=*phead;

assert(phead);

if (*phead == NULL)

{

return;

}

else

{

PlinkNode del = NULL;;

while (cur)

{

if (cur == pos)

{

del = cur;

prev->next = cur->next;

break;

}

prev = cur;

cur = cur->next;

}

free(del);

del = NULL;

}

}

void EraseNotTail(PlinkNode pos)//删除无头非尾节点

{

PlinkNode del=pos->next;

pos->Data = pos->next->Data;

pos->next = del->next;

free(del);

del = NULL;

}

int GetListLength(PlinkList phead)//获取链表长度

{

PlinkNode cur=phead;

int count = 0;

assert(phead);

while (cur)

{

count++;

cur = cur->next;

}

return count;

}

void ReverseList(PlinkList *phead)//反转,逆序列表(头摘头插法)

{

PlinkNode cur = *phead;

PlinkNode prev = NULL;

PlinkList pNewhead = NULL;

assert(*phead);

while (cur)

{

prev = cur;

cur = cur->next;

prev->next = pNewhead;

pNewhead = prev;

}

*phead = pNewhead;

}

void BubbleSort(PlinkList *phead)//排序链表(冒泡)

{

PlinkNode cur = *phead;

PlinkNode end = NULL;

assert(*phead);

while (cur!=end)

{

while (cur&&(cur->next!=end))

{

if (cur->Data > cur->next->Data)

{

DataType tmp;

tmp = cur->Data;

cur->Data = cur->next->Data;

cur->next->Data = tmp;

}

cur = cur->next;

}

end = cur;

cur = *phead;

}

}

void InsertFrontNode(PlinkNode pos, DataType x)//在当前节点前插入一个数据

{

PlinkNode NewNode;//现在该节点后插入然后再将节点内的两数交换

assert(pos);

NewNode = (PlinkNode)malloc(sizeof(LinkNode));

NewNode->Data = x;

NewNode->next = pos->next;

pos->next = NewNode;

DataType tmp;

tmp = pos->Data;

pos->Data=NewNode->Data;

NewNode->Data = tmp;

}

PlinkNode Merge(PlinkList phead1, PlinkList phead2)//合并两个有序列表

{

PlinkNode cur1 = phead1;

PlinkNode cur2 = phead2;

PlinkList  Newhead = NULL;

assert(phead1);

assert(phead2);

if (cur1 == cur2)

{

return cur1;

}

else if (cur1 == NULL)

{

return cur2;

}

else if (cur2 == NULL)

{

return cur1;

}

else

{

PlinkNode cur = NULL;

if (cur1->Data > cur2->Data)

{

Newhead = cur2;

cur2 = cur2->next;

}

else if (cur1->Data <= cur2->Data)

{

Newhead = cur1;

cur1 = cur1->next;

}

cur = Newhead;

while (cur1&&cur2)

{

if (cur1->Data > cur2->Data)

{

cur->next = cur2;

cur2 = cur2->next;

}

else

{

cur -> next = cur1;

cur1 = cur1->next;

}

cur = cur->next;

}

if (cur1)

{

cur->next = cur1;

}

if (cur2)

{

cur->next = cur2;

}

}

return Newhead;

}

PlinkNode FindMidNode(PlinkList phead)//查找中间节点(快慢指针法)

{

PlinkNode Fast = phead;

PlinkNode Slow = phead;

while (Fast&&Fast->next)

{

Fast = Fast->next->next;

Slow = Slow->next;

}

return Slow;

}

void DelKNode(PlinkList *phead, int k)//删除链表的倒数第K个节点(快慢指针法)

{

PlinkNode Fast = *phead;

PlinkNode Slow = *phead;

assert(*phead);

while (--k)

{

Fast = Fast->next;

}

while (Fast->next)

{

Fast = Fast->next;

Slow = Slow->next;

}

PlinkNode del=Slow->next;

Slow->Data = del->Data;

Slow->next = del->next;

free(del);

del = NULL;

}

PlinkNode CheckCycle(PlinkList phead)//判断链表是否带环(快慢指针法)

{

PlinkNode Fast = phead;

PlinkNode Slow = phead;

while (Fast->next)

{

Fast = Fast->next->next;

Slow = Slow->next;

if (Slow == Fast)

{

return Slow;

}

}

}

int GetCycleLength(PlinkNode meet)//求取环的长度

{

PlinkNode start= meet;

int count = 0;

assert(meet);

do

{

start = start->next;

count++;

} while (start != meet);

return count;

}

PlinkNode GetCycleEntry(PlinkList phead, PlinkNode meet)//获取环的入口点

{

PlinkNode start = phead;

PlinkNode end=meet;

assert(phead);

while (start !=end)

{

start = start->next;

end = end->next;

}

return end;

}

int CheckCross(PlinkList phead1, PlinkList phead2)//判断两链表是否相交(如果相交则最后一个节点相同)

{

if (phead1 || phead2)

{

return 0;

}

else

{

while (phead1)

{

phead1 = phead1->next;

}

while (phead2)

{

phead2 = phead2->next;

}

if (phead1 == phead2)

{

return 1;

}

else

{

return 0;

}

}

}

#endif  //__LINK_LIST_H__

				
时间: 2024-08-11 09:46:28

C实现单链表的常见功能的相关文章

C/C++——单链表的主要功能实现

恰好在复习C/C++,也重新回顾了一下链表,温故而知新,还是有挺大收获的. 1 /**************************** 2 * 单链表 3 * Author: 玉做的树 4 * 5 * Node* create() 根据输入创建链表 6 * Node* create(int []) 根据数组创建链表 7 * const int length(Node *head) 测长 8 * void print(Node* head) 输出链表 9 * Node* push_back(N

(含有头结点以及尾结点)单链表各类功能的实现

对单链表实现如下功能: void InitList(List *list); //初始化单链表 bool push_back(List *list,ElemType x); //尾插法 void show_seqlist(List *list); //显示链表内容 bool push_front(List *list,ElemType x);//头插法 bool pop_back(List *list); //尾删法 bool pop_front(List *list); //头删法 Node

线性表—单链表

.1.链式存储结构实现 单链表和双链表(这边讲单链表). 2.基础概念 a.结点:结点由数据域和地址域(链)两部分组成.而结点整体在效果上可以看作是该结点的地址(指针).这个地址域一般是后继元素的地址(即下一个结点的总体).所以最后一个元素的地址域为^,其表示空,即没有后续元素.b.单链表:每个结点只有一个地址域的线性链表称为单链表.c.双链表:每个结点有两个地址域的线性表链称为双链表,两个地址域分别指向前驱元素和后继元素. 3.单链表的实现 线性表接口LList: package com.cl

链表-单链表的各种操作

单链表的结构体的定义 typedef struct LNode { ElemType data; struct LNode *next; }LinkList; 基本的单链表的操作 /* 功能:构建一个空的带头节点的单链表*/ Status InitList (struct LNode **L) { (*L) = (struct LNode *)malloc(sizeof(struct LNode)); //产生头节点 if(!*L) exit(OVERFLOW); (*L)->next = NU

单链表(增、删、查找)

     用结构体构建单链表,实现单链表的基本功能. //头文件 #pragma once #include<stdio.h> #include<assert.h> #include<malloc.h> typedef int DataType; typedef struct ListNode { DataType _data; struct ListNode *_next; }ListNode; //初始化 void InitList(ListNode **ppHea

单链表 之c代码

我们知道数据结构就是数据及其相互关系,包括逻辑结构和物理结构.单链表的逻辑结构是一种一对一的线性关系,物理结构是利用节点把数据结合起来,在计算机中体现这种一对一的数据关系.单链表节点包括包含数据本身信息的数据域和体现数据一对一关系的指针域.因为单链表只有一个指向后一节点的单一指针域next 所以单链表只能从前往后遍历,而不能从后向前遍历,这就意味着一旦单链表的某一节点丢失 ,后面所有的数据信息都会丢失,并且单链表有头指针唯一确定,要想查找单链表的 某一数据只能从头开始遍历,最坏时间复杂度为O(n

C:数据结构与算法之单链表

单链表相对于顺序表比较难理解,但是比较实用,单链表的插入,删除不需要移动数据元素,只需要一个指针来寻找所需要的元素,还有一个大优点就是不浪费空间,当你想要增加一个结点可以申请(malloc())一个结点的空间,删除一个结点也可以释放(free()),跟顺序表一样的,首先先来定义一个单链表, 1 typedef struct lnode 2 { 3 int data; 4 struct lnode *next; 5 }LNode,*LinkList; typedef是将类型struct lnode

一起talk C栗子吧(第十二回:C语言实例--单链表一)

各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! 看官们,上一回中咱们没有说具体的例子,而且是说了例子中的文件组织结构.这一回咱们继续说C例子, 说的例子是链表,更准确的说法叫作单链表.咱们不但要说C例子,而且会在例子中使用上一回中说过的 文件组织结构,就当作是举例说明文件组织结构的使用方法. 有点一石二鸟的感觉,哈哈. 链表定义 看官们,所谓的链表其实就是一组元素通过一定的方式链接在一起.比如我们坐的火车

Java数据结构——单链表

一.单链表的概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.这组存储单元可以是连续的,也可以是不连续的. 存储单元由两部分组成,数据源和指针,数据源放数据,指针指向下个存储单元. 二.单链表的结构 采用Node实体类类标识,其中data为存储的数据,next为下一个结点的指针. //链表的实体类 class Node{ public int data; public Node next; public Node(int data) { this.data =