码实现链表的操作函数
1.首先是尾插 ,要实现尾插,首先的先有一个链表,并且为空。
即先构造一个链表,并且进行初始化。
[html] view plain copy
- //构造链表
- typedef int DataType;
- typedef struct SListNode {
- DataType data;
- struct SListNode *pNext;
- } SListNode;
- // 初始化
- void SListInit(SListNode **ppFirst)
- {
- assert(ppFirst !=NULL);
- *ppFirst=NULL;
- }
- 进行尾插前,我们的在构造一个新链表,用来存放尾插后形成的新链表。
- SListNode * CreateNewNode(int data)
- {
- SListNode *pNewNode=(SListNode *)malloc(sizeof(SListNode));
- assert(pNewNode);
- pNewNode->data=data;
- pNewNode->pNext=NULL;
- return pNewNode;
- }
- 下面进行尾插
- void PushBack(SListNode **ppFirst, DataType data)
- {
- assert(ppFirst !=NULL);
- SListNode *pNewNode=CreateNewNode(data);
- if (*ppFirst==NULL) {
- *ppFirst=pNewNode;
- return;
- }
- SListNode *pNode;
- pNode=*ppFirst;
- while (pNode->pNext !=NULL) {
- pNode=pNode->pNext;
- }
- // pNode 就是倒数第一个
- pNode->pNext=pNewNode;
- }
- 再加上打印函数与测试函数,main函数。
- //print
- void Print(SListNode *pFirst)
- {
- SListNode *pNode;
- for (pNode=pFirst; pNode; pNode=pNode->pNext) {
- printf("%d -> ", pNode->data);
- }
- printf("NULL\n");
- }
- //测试函数
- void TestSList()
- {
- SListNode *pFirst;
- SListInit(&pFirst);
- assert(pFirst==NULL);
- PushBack(&pFirst, 1);
- assert(pFirst !=NULL);
- Print(pFirst);
- PushBack(&pFirst, 2);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 4);
- Print(pFirst);
- }
- //main函数
- #include"SList.h"
- int main(){
- TestSList();
- system("pause");
- }
- 效果如下
2.头插
[html] view plain copy
- void PushFront(SListNode **ppFirst, DataType data)
-
- {assert(ppFirst !=NULL);
-
- SListNode *pNewNode=CreateNewNode(data);
-
- pNewNode->pNext=*ppFirst;
- *ppFirst=pNewNode;
- }
- 测试函数如下:
- PushFront(&pFirst, 5);
- PushFront(&pFirst, 8);
- Print(pFirst);
3.按下标插入(令给定下标是pos,pos一定存在)
[html] view plain copy
- void Insert(SListNode **ppFirst, SListNode *pPos, DataType data)
- {
- assert(ppFirst !=NULL);
- SListNode *pNode;
- pNode=*ppFirst;
- // pPos 是第一个结点地址
- if (pPos==*ppFirst) {
- PushFront(ppFirst, data);
- return;
- }
- while (pNode->pNext !=pPos){
- pNode=pNode->pNext;
- }
- SListNode *pNewNode=CreateNewNode(data);
- pNode->pNext=pNewNode;
- pNewNode->pNext=pPos;
- }
- 进行按给定位置插入 需确定pos位置,需定义find函数
- //find
- SListNode * Find(SListNode *pFirst, DataType data)
- {
- SListNode *pNode;
- for (pNode=pFirst; pNode; pNode=pNode->pNext) {
- if (pNode->data==data) {
- return pNode;
- }
- }
- return NULL;
- }
- 测试代码如下:
- SListNode *pFound=Find(pFirst, 3);
- if (pFound==NULL) {
- printf("没有找到\n");
- }
- else {
- printf("%d\n", pFound->data);
- Insert(&pFirst, pFound, 100);
- }
- Print(pFirst);
- 效果如下:
二、删除
1.头删
[html] view plain copy
- void PopFront(SListNode **ppFirst)
- {
- assert(ppFirst !=NULL);
- assert(*ppFirst !=NULL);
-
- SListNode *pOldFirst=*ppFirst;
- *ppFirst=(*ppFirst)->pNext;
- free(pOldFirst);
- }
- 测试代码如下:
- PopFront(&pFirst);
- Print(pFirst);
- 效果如下:
2.尾删
[html] view plain copy
- void PopBack(SListNode **ppFirst)
- {
- assert(ppFirst !=NULL);
- assert(*ppFirst !=NULL);
- if ((*ppFirst)->pNext==NULL) {
- free(*ppFirst);
- *ppFirst=NULL;
- return;
- }
- SListNode *pNode=*ppFirst;
- while (pNode->pNext->pNext !=NULL)
- {
- pNode=pNode->pNext;
- }
- free(pNode->pNext);
- pNode->pNext=NULL;
- }
- 测试函数如下:
- PopBack(&pFirst);
- Print(pFirst);
- 效果如下:
3.按位置删除(根据结点地址删除,结点肯定在链表里,令节点位置为pPos)
[html] view plain copy
- void Erase(SListNode **ppFirst, SListNode *pPos)
- {
- assert(ppFirst !=NULL);
- assert(*ppFirst !=NULL);
- if (*ppFirst==pPos) {
- PopFront(ppFirst);
- return;
- }
- SListNode *pCur;
- for (pCur=*ppFirst; pCur->pNext !=pPos; pCur=pCur->pNext) {
- }
- // pCur 就是 pPos的前一个
- pCur->pNext=pPos->pNext;
- free(pPos);
- }
- 测试函数如下:
- SListNode *pFound=Find(pFirst, 1);
- { if (pFound==NULL) {
- printf("没有找到\n");
- }
- else {
- printf("%d\n", pFound->data);
- Erase(&pFirst, pFound);
- }
- SListDestroy(&pFirst);
- }
- 运行效果如下
4.按值删除(根据数据去删除,删除遇到的第一个结点)
[html] view plain copy
- void Remove(SListNode **ppFirst, DataType data)
- {
- SListNode *pFound=Find(*ppFirst, data);
- if (pFound !=NULL) {
- Erase(ppFirst, pFound);
- }
- }
- 测试函数如下:
- void TestRemove()
- {
- SListNode *pFirst;
- SListInit(&pFirst);
- PushBack(&pFirst, 4);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 1);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 5);
- PushBack(&pFirst, 3);
- Print(pFirst);
- Remove(&pFirst, 3);
- Print(pFirst);
- 运行效果如图
5.按值删除( 根据数据去删除,删除遇到的所有结点)
[html] view plain copy
- void RemoveAll(SListNode **ppFirst, DataType data)
- {
- SListNode *pNode=*ppFirst;
- SListNode *pNext;
- while (pNode->pNext) {
- if (pNode->pNext->data==data) {
- pNext=pNode->pNext;
- pNode->pNext=pNode->pNext->pNext;
- free(pNext);
- }
- else {
- pNode=pNode->pNext;
- }
- }
- if ((*ppFirst)->data==data) {
- PopFront(ppFirst);
- }
- }
- 测试函数如下:
- RemoveAll(&pFirst, 3);
- Print(pFirst);
- 测试效果如下
源代码如下:
[html] view plain copy
- Hello.h
- #pragma once
- #include <stdlib.h>
- #include <assert.h>
- #include <stdio.h>
- typedef int DataType;
- typedef struct SListNode {
- DataType data;
- struct SListNode *pNext;
- } SListNode;
- // 初始化
- void SListInit(SListNode **ppFirst)
- {
- assert(ppFirst !=NULL);
- *ppFirst=NULL;
- }
- SListNode * CreateNewNode(int data)
- {
- SListNode *pNewNode=(SListNode *)malloc(sizeof(SListNode));
- assert(pNewNode);
- pNewNode->data=data;
- pNewNode->pNext=NULL;
-
- return pNewNode;
- }
- //打印函数
- void Print(SListNode *pFirst)
- {
- SListNode *pNode;
- for (pNode=pFirst; pNode; pNode=pNode->pNext) {
- printf("%d -> ", pNode->data);
- }
- printf("NULL\n");
- }
- // 销毁
- void SListDestroy(SListNode **ppFirst)
- {
- assert(ppFirst !=NULL);
- SListNode *pNode, *pNext;
-
- pNode=*ppFirst;
- while (pNode !=NULL) {
- pNext=pNode->pNext;
- free(pNode);
- pNode=pNext;
- }
- *ppFirst=NULL;
- }
-
- // 查找,返回遇到的第一个
- // 如果找到了,返回结点地址
- // 否则返回 NULL
- SListNode * Find(SListNode *pFirst, DataType data)
- {
- SListNode *pNode;
- for (pNode=pFirst; pNode; pNode=pNode->pNext) {
- if (pNode->data==data) {
- return pNode;
- }
- }
- return NULL;
- }
- // 增删改查
-
- // 尾插
- void PushBack(SListNode **ppFirst, DataType data)
- {
- assert(ppFirst !=NULL);
- SListNode *pNewNode=CreateNewNode(data);
- if (*ppFirst==NULL) {
- *ppFirst=pNewNode;
- return;
- }
- SListNode *pNode;
- pNode=*ppFirst;
- while (pNode->pNext !=NULL) {
- pNode=pNode->pNext;
- }
- // pNode 就是倒数第一个
- pNode->pNext=pNewNode;
- }
- /*
- // 头插
- void PushFront(SListNode **ppFirst, DataType data)
- {
- assert(ppFirst !=NULL);
- SListNode *pNewNode=CreateNewNode(data);
- pNewNode->pNext=*ppFirst;
- *ppFirst=pNewNode;
- }
- // 插入到给定结点 pPos 前,pPos 肯定在链表里
- void Insert(SListNode **ppFirst, SListNode *pPos, DataType data)
- {
- assert(ppFirst !=NULL);
- SListNode *pNode;
- pNode=*ppFirst;
- // pPos 是第一个结点地址
- if (pPos==*ppFirst) {
- PushFront(ppFirst, data);
- return;
- }
- while (pNode->pNext !=pPos){
- pNode=pNode->pNext;
- }
- SListNode *pNewNode=CreateNewNode(data);
- pNode->pNext=pNewNode;
- pNewNode->pNext=pPos;
- }
- */
- // 头删
- void PopFront(SListNode **ppFirst)
- {
- assert(ppFirst !=NULL);
- assert(*ppFirst !=NULL);
- SListNode *pOldFirst=*ppFirst;
- *ppFirst=(*ppFirst)->pNext;
- free(pOldFirst);
- }
- // 尾删
- void PopBack(SListNode **ppFirst)
- {
- assert(ppFirst !=NULL);
- assert(*ppFirst !=NULL);
- if ((*ppFirst)->pNext==NULL) {
- free(*ppFirst);
- *ppFirst=NULL;
- return;
- }
- SListNode *pNode=*ppFirst;
- while (pNode->pNext->pNext !=NULL)
- {
- pNode=pNode->pNext;
- }
- free(pNode->pNext);
- pNode->pNext=NULL;
- }
- // 根据结点地址删除,结点肯定在链表里
- void Erase(SListNode **ppFirst, SListNode *pPos)
- {
- assert(ppFirst !=NULL);
- assert(*ppFirst !=NULL);
- if (*ppFirst==pPos) {
- PopFront(ppFirst);
- return;
- }
- SListNode *pCur;
- for (pCur=*ppFirst; pCur->pNext !=pPos; pCur=pCur->pNext) {
- }
- // pCur 就是 pPos的前一个
- pCur->pNext=pPos->pNext;
- free(pPos);
- }
- /*
- void TestSList()
- {
- SListNode *pFirst;
- SListInit(&pFirst);
- assert(pFirst==NULL);
- PushBack(&pFirst, 1);
- assert(pFirst !=NULL);
- Print(pFirst);
- PushBack(&pFirst, 1);
- PushBack(&pFirst, 2);
- PushBack(&pFirst, 3);
- Print(pFirst);
- PushFront(&pFirst, 5);
- PushFront(&pFirst, 8);
- Print(pFirst);
- SListNode *pFound=Find(pFirst, 3);
- if (pFound==NULL) {
- printf("没有找到\n");
- }
- else {
- printf("%d\n", pFound->data);
- Insert(&pFirst, pFound, 100);
- }
- Print(pFirst);
- PopFront(&pFirst);
- Print(pFirst);
- PopBack(&pFirst);
- Print(pFirst);
- SListNode *pFound=Find(pFirst, 9);
- { if (pFound==NULL) {
- printf("没有找到\n");
- }
- else {
- printf("%d\n", pFound->data);
- Erase(&pFirst, pFound);
- }
- SListDestroy(&pFirst);
- }
- }
- */
- // 根据数据去删除,删除遇到的第一个结点
- void Remove(SListNode **ppFirst, DataType data)
- {
- SListNode *pFound=Find(*ppFirst, data);
- if (pFound !=NULL) {
- Erase(ppFirst, pFound);
- }
- }
- // 根据数据去删除,删除遇到的所有结点
- void RemoveAll(SListNode **ppFirst, DataType data)
- {
- SListNode *pNode=*ppFirst;
- SListNode *pNext;
- while (pNode->pNext) {
- if (pNode->pNext->data==data) {
- pNext=pNode->pNext;
- pNode->pNext=pNode->pNext->pNext;
- free(pNext);
- }
- else {
- pNode=pNode->pNext;
- }
- }
- if ((*ppFirst)->data==data) {
- PopFront(ppFirst);
- }
- }
- void TestRemove()
- {
- SListNode *pFirst;
- SListInit(&pFirst);
- PushBack(&pFirst, 4);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 1);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 3);
- PushBack(&pFirst, 5);
- PushBack(&pFirst, 3);
- Print(pFirst);
- Remove(&pFirst, 3);
- Print(pFirst);
- RemoveAll(&pFirst, 3);
- Print(pFirst);
- }
[html] view plain copy
- main.c
- #include"Hello.h"
- int main(){
- TestRemove();
- //TestSList();
- system("pause");
- }
到此,单链表的基本功能差不多都实现了。
本命名规范
index.css: 一般用于首页建立样式
head.css: 头部样式,当多个页面头部设计风格相同时使用。
base.css: 共用样式。
style.css:独立页面所使用的样式文件。
global.css:页面样式基础,全局公用样式,页面中必须包含。
layout.css:布局、版面样式,公用类型较多时使用,一般用在首页级页面和产品类页面中
module.css:模块,用于产品类页,也可与其它样式配合使用。
master.css:主要的样式表
columns.css:专栏样式
themes.css:主体样式
forms.css:表单样式
mend.css:补丁,基于以上样式进行的私有化修补。
页面结构命名:
page:代表整个页面,用于最外层。
wrap:外套,将所有元素包在一起的一个外围包,用于最外层
wrapper:页面外围控制整体布局宽度,用于最外层
container:一个整体容器,用于最外层
head,header:页头区域,用于头部
nav: 导航条
content:内容,网站中最重要的内容区域,用于网页中部主体
main:网站中的主要区域(表示最重要的一块位置),用于中部主体内容
column:栏目
sidebar:侧栏
foot,footer:页尾、页脚。网站一些附加信息放置区域,(或命名为 copyright)用于底部
导航命名:
nav, navbar, navigation, nav-wrapper:导航条或导航包,代表横向导航
topnav:顶部导航
mainbav:主导航
subnav:子导航
sidebar:边导航
leftsidebar 或 sidebar_a:左导航
rightsidebar 或 sidebar_b:右导航
title:标题
summary:摘要
menu:菜单,区域包含一般的链接和菜单
submenu:子菜单
drop:下拉
dorpmenu:下拉菜单
links:链接菜单
功能命名:
logo:标记网站logo标志
banner:标语、广告条、顶部广告条
login:登陆,(例如登录表单:form-login)
loginbar:登录条
register:注册
tool, toolbar:工具条
search:搜索
searchbar:搜索条
searchlnput:搜索输入框
shop:功能区,表示现在的
icon:小图标
label:商标
homepage:首页
subpage:二级页面子页面
hot:热门热点
list:文章列表,(例如:新闻列表:list-news)
scroll:滚动
tab:标签
sitemap:网站地图
msg 或 message:提示信息
current:当前的
joinus:加入
status:状态
btn:按钮,(例如:搜索按钮可写成:btn-search)
tips:小技巧
note:注释
guild:指南
arr, arrow:标记箭头
service:服务
breadcrumb:(即页面所处位置导航提示)
download:下载
vote:投票
siteinfo:网站信息
partner:合作伙伴
link, friendlink:友情链接
copyright:版权信息
siteinfoCredits:信誉
siteinfoLegal:法律信息