碼實(shí)現(xiàn)鏈表的操作函數(shù)
1.首先是尾插 ,要實(shí)現(xiàn)尾插,首先的先有一個(gè)鏈表,并且為空。
即先構(gòu)造一個(gè)鏈表,并且進(jìn)行初始化。
[html] view plain copy
- //構(gòu)造鏈表
- typedef int DataType;
- typedef struct SListNode {
- DataType data;
- struct SListNode *pNext;
- } SListNode;
- // 初始化
- void SListInit(SListNode **ppFirst)
- {
- assert(ppFirst !=NULL);
- *ppFirst=NULL;
- }
- 進(jìn)行尾插前,我們的在構(gòu)造一個(gè)新鏈表,用來存放尾插后形成的新鏈表。
- SListNode * CreateNewNode(int data)
- {
- SListNode *pNewNode=(SListNode *)malloc(sizeof(SListNode));
- assert(pNewNode);
- pNewNode->data=data;
- pNewNode->pNext=NULL;
- return pNewNode;
- }
- 下面進(jìn)行尾插
- 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 就是倒數(shù)第一個(gè)
- pNode->pNext=pNewNode;
- }
- 再加上打印函數(shù)與測(cè)試函數(shù),main函數(shù)。
- //print
- void Print(SListNode *pFirst)
- {
- SListNode *pNode;
- for (pNode=pFirst; pNode; pNode=pNode->pNext) {
- printf("%d -> ", pNode->data);
- }
- printf("NULL\n");
- }
- //測(cè)試函數(shù)
- 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函數(shù)
- #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;
- }
- 測(cè)試函數(shù)如下:
- PushFront(&pFirst, 5);
- PushFront(&pFirst, 8);
- Print(pFirst);
3.按下標(biāo)插入(令給定下標(biāo)是pos,pos一定存在)
[html] view plain copy
- void Insert(SListNode **ppFirst, SListNode *pPos, DataType data)
- {
- assert(ppFirst !=NULL);
- SListNode *pNode;
- pNode=*ppFirst;
- // pPos 是第一個(gè)結(jié)點(diǎn)地址
- if (pPos==*ppFirst) {
- PushFront(ppFirst, data);
- return;
- }
- while (pNode->pNext !=pPos){
- pNode=pNode->pNext;
- }
- SListNode *pNewNode=CreateNewNode(data);
- pNode->pNext=pNewNode;
- pNewNode->pNext=pPos;
- }
- 進(jìn)行按給定位置插入 需確定pos位置,需定義find函數(shù)
- //find
- SListNode * Find(SListNode *pFirst, DataType data)
- {
- SListNode *pNode;
- for (pNode=pFirst; pNode; pNode=pNode->pNext) {
- if (pNode->data==data) {
- return pNode;
- }
- }
- return NULL;
- }
- 測(cè)試代碼如下:
- 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);
- }
- 測(cè)試代碼如下:
- 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;
- }
- 測(cè)試函數(shù)如下:
- PopBack(&pFirst);
- Print(pFirst);
- 效果如下:
3.按位置刪除(根據(jù)結(jié)點(diǎn)地址刪除,結(jié)點(diǎn)肯定在鏈表里,令節(jié)點(diǎn)位置為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的前一個(gè)
- pCur->pNext=pPos->pNext;
- free(pPos);
- }
- 測(cè)試函數(shù)如下:
- SListNode *pFound=Find(pFirst, 1);
- { if (pFound==NULL) {
- printf("沒有找到\n");
- }
- else {
- printf("%d\n", pFound->data);
- Erase(&pFirst, pFound);
- }
- SListDestroy(&pFirst);
- }
- 運(yùn)行效果如下
4.按值刪除(根據(jù)數(shù)據(jù)去刪除,刪除遇到的第一個(gè)結(jié)點(diǎn))
[html] view plain copy
- void Remove(SListNode **ppFirst, DataType data)
- {
- SListNode *pFound=Find(*ppFirst, data);
- if (pFound !=NULL) {
- Erase(ppFirst, pFound);
- }
- }
- 測(cè)試函數(shù)如下:
- 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);
- 運(yùn)行效果如圖
5.按值刪除( 根據(jù)數(shù)據(jù)去刪除,刪除遇到的所有結(jié)點(diǎn))
[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);
- }
- }
- 測(cè)試函數(shù)如下:
- RemoveAll(&pFirst, 3);
- Print(pFirst);
- 測(cè)試效果如下
源代碼如下:
[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;
- }
- //打印函數(shù)
- 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;
- }
-
- // 查找,返回遇到的第一個(gè)
- // 如果找到了,返回結(jié)點(diǎn)地址
- // 否則返回 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 就是倒數(shù)第一個(gè)
- pNode->pNext=pNewNode;
- }
- /*
- // 頭插
- void PushFront(SListNode **ppFirst, DataType data)
- {
- assert(ppFirst !=NULL);
- SListNode *pNewNode=CreateNewNode(data);
- pNewNode->pNext=*ppFirst;
- *ppFirst=pNewNode;
- }
- // 插入到給定結(jié)點(diǎn) pPos 前,pPos 肯定在鏈表里
- void Insert(SListNode **ppFirst, SListNode *pPos, DataType data)
- {
- assert(ppFirst !=NULL);
- SListNode *pNode;
- pNode=*ppFirst;
- // pPos 是第一個(gè)結(jié)點(diǎn)地址
- 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;
- }
- // 根據(jù)結(jié)點(diǎn)地址刪除,結(jié)點(diǎn)肯定在鏈表里
- 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的前一個(gè)
- 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);
- }
- }
- */
- // 根據(jù)數(shù)據(jù)去刪除,刪除遇到的第一個(gè)結(jié)點(diǎn)
- void Remove(SListNode **ppFirst, DataType data)
- {
- SListNode *pFound=Find(*ppFirst, data);
- if (pFound !=NULL) {
- Erase(ppFirst, pFound);
- }
- }
- // 根據(jù)數(shù)據(jù)去刪除,刪除遇到的所有結(jié)點(diǎn)
- 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");
- }
到此,單鏈表的基本功能差不多都實(shí)現(xiàn)了。
本命名規(guī)范
index.css: 一般用于首頁建立樣式
head.css: 頭部樣式,當(dāng)多個(gè)頁面頭部設(shè)計(jì)風(fēng)格相同時(shí)使用。
base.css: 共用樣式。
style.css:獨(dú)立頁面所使用的樣式文件。
global.css:頁面樣式基礎(chǔ),全局公用樣式,頁面中必須包含。
layout.css:布局、版面樣式,公用類型較多時(shí)使用,一般用在首頁級(jí)頁面和產(chǎn)品類頁面中
module.css:模塊,用于產(chǎn)品類頁,也可與其它樣式配合使用。
master.css:主要的樣式表
columns.css:專欄樣式
themes.css:主體樣式
forms.css:表單樣式
mend.css:補(bǔ)丁,基于以上樣式進(jìn)行的私有化修補(bǔ)。
頁面結(jié)構(gòu)命名:
page:代表整個(gè)頁面,用于最外層。
wrap:外套,將所有元素包在一起的一個(gè)外圍包,用于最外層
wrapper:頁面外圍控制整體布局寬度,用于最外層
container:一個(gè)整體容器,用于最外層
head,header:頁頭區(qū)域,用于頭部
nav: 導(dǎo)航條
content:內(nèi)容,網(wǎng)站中最重要的內(nèi)容區(qū)域,用于網(wǎng)頁中部主體
main:網(wǎng)站中的主要區(qū)域(表示最重要的一塊位置),用于中部主體內(nèi)容
column:欄目
sidebar:側(cè)欄
foot,footer:頁尾、頁腳。網(wǎng)站一些附加信息放置區(qū)域,(或命名為 copyright)用于底部
導(dǎo)航命名:
nav, navbar, navigation, nav-wrapper:導(dǎo)航條或?qū)Ш桨頇M向?qū)Ш?/p>
topnav:頂部導(dǎo)航
mainbav:主導(dǎo)航
subnav:子導(dǎo)航
sidebar:邊導(dǎo)航
leftsidebar 或 sidebar_a:左導(dǎo)航
rightsidebar 或 sidebar_b:右導(dǎo)航
title:標(biāo)題
summary:摘要
menu:菜單,區(qū)域包含一般的鏈接和菜單
submenu:子菜單
drop:下拉
dorpmenu:下拉菜單
links:鏈接菜單
功能命名:
logo:標(biāo)記網(wǎng)站logo標(biāo)志
banner:標(biāo)語、廣告條、頂部廣告條
login:登陸,(例如登錄表單:form-login)
loginbar:登錄條
register:注冊(cè)
tool, toolbar:工具條
search:搜索
searchbar:搜索條
searchlnput:搜索輸入框
shop:功能區(qū),表示現(xiàn)在的
icon:小圖標(biāo)
label:商標(biāo)
homepage:首頁
subpage:二級(jí)頁面子頁面
hot:熱門熱點(diǎn)
list:文章列表,(例如:新聞列表:list-news)
scroll:滾動(dòng)
tab:標(biāo)簽
sitemap:網(wǎng)站地圖
msg 或 message:提示信息
current:當(dāng)前的
joinus:加入
status:狀態(tài)
btn:按鈕,(例如:搜索按鈕可寫成:btn-search)
tips:小技巧
note:注釋
guild:指南
arr, arrow:標(biāo)記箭頭
service:服務(wù)
breadcrumb:(即頁面所處位置導(dǎo)航提示)
download:下載
vote:投票
siteinfo:網(wǎng)站信息
partner:合作伙伴
link, friendlink:友情鏈接
copyright:版權(quán)信息
siteinfoCredits:信譽(yù)
siteinfoLegal:法律信息