对于单链表的基本操作

                                                                                          对于单链表的基本操作

    如果要讲到单链表的基本操作,首先我们就得知道什么是链表?下面我就给大家简单介绍一下什么是链表:链表是一种物理存储单元上非连续、非顺序的存储结构,而链表中的链接顺序考的是指针的链接次序来决定的。节点在运行时动态生成,而每个结点包括存储数据的数据域和指向下一个结点的指针域。而每个结点只有一个链域的链表则称为单链表。单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点,但应该注意的是链表由头指针唯一确定,单链表可以由头指针的名字来命名,此外尾结点的next域应为NULL。

对于单链表的操作一般就是增、删、查、找以及排序。下面便用代码来实现这些基本的操作:

PlinkList.h:(头文件)

#define _CRT_SECURE_NO_WARNINGS 1

#ifndef __LINKLIST_H__//防止头文件的重定义  
#define __LINKLIST_H__  
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int DataType;

typedef struct LinkNode
{
	DataType data;
	struct LinkNode* next;
}LinkNode,*pLinkNode;

typedef struct LinkList
{
	LinkNode* pHead;
}LinkList,*pLinkList;


void InitLinkList(pLinkList pList);//链表的初始化
void DestoryList(pLinkList pList);//链表的释放
void PushBack(pLinkList pList,DataType x);//尾插
void PushFront(pLinkList pList,DataType x);//头插
void PopBack(pLinkList pList);//尾删
void PopFront(pLinkList pList);//头删
void PrintList(pLinkList pList);//打印链表
pLinkNode Find(pLinkList pList,DataType x);//查找
void Insert(pLinkList pList,pLinkNode pos,DataType x);//在指定位置插入数据
void Remove(pLinkList pList,DataType x);//删除指定数据
void RemoveAll(pLinkList pList,DataType x);//删除所有数据
void Erase(pLinkList pList,pLinkNode pos);//删除指定位置的数据
void BubbleSort(pLinkList pList);//链表的排序(冒泡)

#endif //__LINKLIST_H__
<pre name="code" class="cpp">#include"PlinkList.h"

void InitLinkList(pLinkList pList)//链表的初始化
{
	assert(pList);
	pList->pHead=NULL;
}
void DestoryList(pLinkList pList)//链表的释放
{
	pLinkNode cur=NULL;
	cur=pList->pHead;
	assert(pList);
	while(cur)
	{
		pLinkNode del=cur;
		cur=cur->next;
		free(del);
		del=NULL;
	}
	pList->pHead=NULL;
}
void PushBack(pLinkList pList,DataType x)//尾插
{
	pLinkNode newNode=NULL;
	newNode=(pLinkNode)malloc(sizeof(LinkNode));
	assert(pList);
	if(NULL==newNode)
	{
		printf("out of memory\n");
		exit(EXIT_FAILURE);
	}
	newNode->data=x;
	newNode->next=NULL;
	if(NULL==pList->pHead)
	{
		pList->pHead=newNode;
	}
	else
	{
		pLinkNode cur=pList->pHead;
		while(cur->next!=NULL)
		{
			cur=cur->next;
		}
		cur->next=newNode;
	}
}
pLinkNode BuyNode(DataType x) //创建一个结点 
{
	pLinkNode newNode=NULL;
	newNode=(pLinkNode)malloc(sizeof(LinkNode));
	if(NULL==newNode)
	{
		printf("out of memory\n");
		exit(EXIT_FAILURE);
	}
	newNode->data=x;
	newNode->next=NULL;
	return newNode;
}
void PushFront(pLinkList pList,DataType x)//头插
{
	pLinkNode newNode=NULL;
	assert(pList);
	newNode=BuyNode(x);
	newNode->next=pList->pHead;
	pList->pHead=newNode;
}
void PopBack(pLinkList pList)//尾删
{
	pLinkNode cur=NULL;
	assert(pList);
	cur=pList->pHead;
	if(NULL==cur)//空链表
	{
		printf("该链表为空\n");
	}
	else if(NULL==cur->next)//该链表只有一个结点
	{
		free(cur);
		cur=NULL;
		pList->pHead=NULL;
	}
	else//该链表有多个结点
	{
		while(cur->next!=NULL)
		{
			cur=cur->next;
		}
		free(cur->next);
		cur->next=NULL;
	}
}
void PopFront(pLinkList pList)//头删
{
	pLinkNode cur=NULL;
	assert(pList);
	cur=pList->pHead;
	if(NULL==cur)//空链表
	{
		printf("该链表为空\n");
	}
	else
	{
		pLinkNode newHead=NULL;
		cur=cur->next;
		newHead=cur;
		free(cur);
		cur=NULL;
		pList->pHead=newHead;
	}
}
void PrintList(pLinkList pList)//打印链表
{
	pLinkNode cur=NULL;
	cur=pList->pHead;
	assert(pList);
	while(cur)
	{
		printf("%d->",cur->data);
		cur=cur->next;
	}
	printf("over\n");
}
pLinkNode Find(pLinkList pList,DataType x)//查找
{
	pLinkNode cur=NULL;
	assert(pList);
	cur=pList->pHead;
	if(NULL==cur)
	{
		printf("该链表为空链表\n");
	}
	while(cur->next!=NULL)
	{
		if(cur->data==x)
		{
			return cur;
		}
		cur=cur->next;
	}
	return NULL;
}
void Insert(pLinkList pList,pLinkNode pos,DataType x)//在指定位置之 前插入数据
{
	pLinkNode newNode=NULL;
	assert(pList);
	assert(pos);
	newNode=pList->pHead;
	newNode=BuyNode(x);
	if(pos == pList->pHead)  
    {  
        PushFront(pList, x);  
    }
	else
	{
		pLinkNode cur=pList->pHead;
		while(cur->next!=pos)
		{
			cur=cur->next;
		}
		cur->next=newNode;
		newNode->next=pos;
	}
}
void Remove(pLinkList pList,DataType x)//删除指定数据
{
	pLinkNode Node=NULL;
	pLinkNode pos=NULL;
	assert(pList);
	Node=Find(pList,x);
	if(Node==NULL)
	{
		printf("该链表为空链表/n");
	}
	else if(Node=pList->pHead)
	{
		PopFront(pList);
	}
	else
	{
		pLinkNode cur=pList->pHead;
		while(cur->next!=NULL)
		{
			cur=cur->next;
		 }  
        cur->next = pos->next;  
        free(pos);  
        pos = NULL;  
    }  
}
void RemoveAll(pLinkList pList,DataType x)//删除所有数据
{
	pLinkNode cur=NULL;
	assert(pList);
	cur=pList->pHead;
	while(cur)
	{
		cur=cur->next;
		free(cur);
		cur=NULL;
	}
	cur->next=NULL;
}
void Erase(pLinkList pList,pLinkNode pos)//删除指定位置的数据
{
	 assert(pos);  
    assert(pList);  
    if(pos == pList->pHead)  
    {  
        PopFront(pList);  
    }  
    else  
    {  
        pLinkNode cur = pList->pHead;  
        while(cur->next != pos)  
        {  
            cur = cur->next;  
        }  
        cur->next = pos->next;  
        free(pos);  
        pos = NULL;  
    }  
}
void BubbleSort(pLinkList pList)//链表的排序(冒泡)
{
	pLinkNode cur=pList->pHead;  
    pLinkNode cmp=pList->pHead;  
    DataType flag=0;  
    while(cur->next != NULL)  
    {  
        flag=0;  
        while(cmp->next != NULL)  
        {  
            if(cmp->data > cmp->next->data)   //升序排列  
            {  
                DataType tmp=cmp->data;  
                cmp->data=cmp->next->data;  
                cmp->next->data=tmp;  
                flag=1;  
            }  
            cmp=cmp->next;  
        }  
        cur=cur->next;  
        if(flag == 0)  
            break;  
    }
	printf("排序成功\n");
}


 




  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。单链表基本操作包括插入、删除和查找等操作。 1. 插入操作:在单链表中插入一个新节点,可以在表头或者表尾插入,也可以在指定位置插入。具体步骤如下: - 在表头插入:创建一个新节点,将新节点的指针指向原来的表头节点,然后将新节点设置为新的表头节点。 - 在表尾插入:创建一个新节点,将新节点的指针指向空,然后将原来的表尾节点的指针指向新节点。 - 在指定位置插入:创建一个新节点,将新节点的指针指向插入位置的下一个节点,然后将插入位置的前一个节点的指针指向新节点。 2. 删除操作:从单链表中删除一个节点,可以删除表头、表尾或者指定位置的节点。具体步骤如下: - 删除表头:将表头节点的指针指向下一个节点,然后释放原来的表头节点。 - 删除表尾:找到倒数第二个节点,将其指针指向空,然后释放原来的表尾节点。 - 删除指定位置:找到要删除节点的前一个节点,将其指针指向要删除节点的下一个节点,然后释放要删除的节点。 3. 查找操作:在单链表中查找指定元素的节点,可以从表头开始遍历整个链表,直到找到目标节点或者遍历到链表末尾。具体步骤如下: - 从表头开始,依次访问每个节点,比较节点的数据元素与目标元素是否相等。 - 如果相等,则找到目标节点;如果不相等,则继续访问下一个节点,直到链表末尾。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值