单链表基本操作详解

#  单链表



文中提到的内容的链接一并列在这里:

单链表详细分析的博客链接:http://blog.csdn.net/bitboss/article/details/51586293







@ 昨天用6个小时将单链表初步成型,那么说好的高质版就在今天完成!


@ 首先,因为前面实现过顺序表,就先来说说顺序表和单链表的区别吧!(画图功底太差,本篇无插图)

@ 顺序表存储位置是相邻连续的,可以随即访问的一种数据结构,一个顺序表在使用前必须指定起长度,一旦分配内 存,则在使用中不可以动态的更改。他的优点是访问数据是比 较方便,可以随即的访问表中的任何一个数据。

@ 链表是通过指针来描述元素关系的一种数据结构,他可以是物理地址不连续的物理空间。不能随即访问链表元素, 必须从表头开始,一步一步搜索元素。它的优点是:对于数 组,可以动态的改变数据的长度,分配物理空间。

@ 在使用中:如果一个数组在使用中,查询比较多,而插入,删除数据比较少,数组的长度不变时,选顺序表比较合 理。如果插入,删除,长度不定的数组,可以选链表。


# 我在这篇文章将函数功能一个一个列出来单独说明,最后将全部综合在一起列出来;

先将自定义的头文件包含一些函数的声明列出来,还有主函数包含测试部分,请先看这部分,方便理解后面的内容!

代码中包含部分注释!!!

@ “LinkList.h”

#define  _CRT_SECURE_NO_WARNINGS 1//消除scanf的警告!

#ifndef __LINKLIST_H__//防止头文件的重定义
#define __LINKLIST_H__

//将所有引入的头文件都放到自定义的头文件中即可!
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int DataType;//将int重命名,方便修改,如果元素是char只需要将int改为char;

enum Select//将所有选项用枚举表现出来,方便阅读;很有必要的操作,增强代码的可读性;
{
	EXIT,
	INSERT,
	PRINT,
	REMOVE,
	REMOVEALL,
	SEARCH,
	SORT,
	PUSHF,
	PUSHB,
	POPF,
	POPB,
	DOSTORY,
	EASER,

	
};

typedef struct LinkNode
{
	DataType data;
	struct LinkNode* next;
}LinkNode,*pLinkNode;//结点结构体

typedef struct LinkList//将头指针单独封装一个结构体方便使用!
{
	LinkNode* pHead;//头结点指针
}LinkList ,*pLinkList;//链表


void InitLinkList(pLinkList pList);//初始化列表
void PrintList(pLinkList pList);//打印
void DostoryList(pLinkList pList);//free链表

void PopBack(pLinkList pList);//尾删
void PopFront(pLinkList pList);//头删
void PushBack(pLinkList pList,DataType x);//尾插
void PushFront(pLinkList pList,DataType x);//头插
void Insert(pLinkList pList,pLinkNode pos,DataType x);//指定位置前或者后插入元素


pLinkNode Find(pLinkList pList,DataType x);//查找
void Search(pLinkList pList,DataType x);//查找指定元素;


void Remove(pLinkList pList,DataType x);//删除指定元素
void RemoveAll(pLinkList pList,DataType x);//删除所有出现的指定元素
void Erase(pLinkList pList,pLinkNode pos);//删除指定位置的元素
void BubbleSort(pLinkList pList);//冒泡排序链表元素
void Exit(pLinkList pList);

#endif //__LINKLIST_H__

@ test.c

#include"LinkList.h"

//注意:请仔细阅读自定义头文件"LinkList.h"的内容!!!

//打印菜单这个,主要看自己喜好,设计的好看一点总是没问题的;
//注意的是你每次进行选择一个操作前都要打印一次菜单!

void Print()
{
	printf("\n————————————————————\n");
	printf("***************************************\n");
	printf("**** 0.退出                      ******\n");
	printf("**** 1. 插入元素                 ******\n");
	printf("**** 2. 打印链表                 ******\n");
	printf("**** 3. 删除指定元素             ******\n");
	printf("**** 4. 删除所有出现的指定元素   ******\n");
	printf("**** 5. 查找                     ******\n");
	printf("**** 6. 排序                     ******\n");
	printf("**** 7. 头插                     ******\n");
	printf("**** 8. 尾插                     ******\n");
	printf("**** 9. 头删                     ******\n");
	printf("**** 10. 尾删                    ******\n");
	printf("**** 11. 释放链表                   ******\n");
	printf("**** 12. 删除指定位置的元素      ******\n");
	printf("***************************************\n");
	printf("\n—
  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值