碼實現鏈表的操作函數
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:法律信息