簡單實現鍊錶的基本操作:初始化,銷毀,增刪改查等操作。
slistnode.h
#pragma once
#include
#include
#include
#pragma warning(disable:4996)
typedef int datatype;
typedef struct slistnode
slistnode;
void print(slistnode *pfirst);//列印
void slistinit(slistnode **ppfirst);//初始化
void slistdestroy(slistnode **ppfirst);//銷毀
void pushback(slistnode **ppfirst, datatype data);//尾插
void pushfront(slistnode **ppfirst, datatype data);//頭插
void insert(slistnode **ppfirst,slistnode *pos, datatype data);//指定位置插入
void popfront(slistnode **ppfirst);//頭刪
void popback(slistnode **ppfirst);//尾刪
void erase(slistnode **ppfirst, slistnode *pos);//任意結點刪
slistnode *find(slistnode *pfirst, datatype data);//查詢,找到返回遇到的第乙個結點的位址,沒找到,返回null
void remove(slistnode **pfirst, datatype data);//根據資料刪除,刪除遇到的第乙個結點
void removeall(slistnode **pfirst, datatype data);//根據資料刪除,刪除遇到的所有結點
slistnode.c
#include
"slistnode.h"
void print(slistnode *pfirst)//列印
printf("null\n");
}void slistinit(slistnode **ppfirst)//初始化
slistnode * createnewnode(int data)//創造新節點
void pushback(slistnode **ppfirst, datatype data)//尾插
slistnode *pnode;
pnode =
*ppfirst;
while (pnode->pnext !=
null)
pnode->pnext = pnewnode;
}void pushfront(slistnode **ppfirst, datatype data)//頭插
void insert(slistnode **ppfirst, slistnode *pos, datatype data)//指定位置插入
while (pnode->pnext != pos)
slistnode *pnewnode = createnewnode(data);
pnode->pnext = pnewnode;
pnewnode->pnext = pos;
}slistnode *find(slistnode *pfirst, datatype data)//查詢,找到返回遇到的第乙個結點的位址,沒找到,返回null
}return
null;
}void popfront(slistnode **ppfirst)//頭刪
void popback(slistnode **ppfirst)//尾刪
slistnode *pnode =
*ppfirst;
while (pnode->pnext->pnext !=
null)
free(pnode->pnext);
pnode = pnode->pnext;
}void erase(slistnode **ppfirst, slistnode *pos)//任意結點刪
slistnode *pcur =
*ppfirst;
while (pcur->pnext != pos)
pcur->pnext = pos->pnext;
free(pos);
}void slistdestroy(slistnode **ppfirst)//銷毀
*ppfirst =
null;
}void remove(slistnode **ppfirst, datatype data)//根據資料刪除,刪除遇到的第乙個結點
}//void removeall(slistnode **ppfirst, datatype data)//根據資料刪除,刪除遇到的所有結點
else
}if ((*ppfirst)->
data
==data)
}
有些鍊錶常考的面試題,分別為:
倒敘列印鍊錶
void
reverseprint(slistnode *pfirst)
printf("%d->", pnode->data);
}
逆置鍊錶
slistnode * reverselist(slistnode *pfirst)
}return p1;
*/ slistnode *pnewfirst =
null;
datatype data;
while (pfirst !=
null)
return pnewfirst;
}
刪除非尾無頭鍊錶
void removenodenottail(slistnode *pos)
無頭鍊錶前插入
void
insertnohead(slistnode *pos, int data)
約瑟夫環
slistnode * jocephcircle(slistnode *pfirst, int k)
pnode ->pnext= pfirst;
//開始迴圈
pnode = pfirst;
while (pnode->pnext != pnode)
prev->pnext = pnode->pnext;
free(pnode);
pnode = prev->pnext;
}return pnode;
}
氣泡排序
void bubblesort(slistnode *pfirst)
while (pcur != tail) //當尾指標不等於頭指標時進行冒泡
pcur = pcur->pnext;
}tail = pcur;
pcur = pfirst;
}return;
}
合併兩個有序鍊錶
slistnode * mergeorderedlist(slistnode *p1first, slistnode *p2first)
else
}//有乙個為空了
slistnode *pnotempty = p1;//假設p1不為空
if (p1 ==
null)
while (pnotempty)
return pnew;
}
遍歷一次,找到中間結點
slistnode * findmid(slistnode *pfirst)
pfast = pfast->pnext;
if (pfast == null)
pslow = pslow->pnext;
}return pslow;
}
遍歷一次,找到倒數第 k 個結點(k從1開始)
slistnode * findk(slistnode *pfirst, int k)
//兩指標同時往後走
while (pfast)
return pslow;
}
遍歷一次,刪除倒數第 k 個結點(k從1開始),不能用替換刪除法
void removek(slistnode *pfirst, int k)
//兩指標同時往後走
while (pfast)
//刪除
ppre->pnext = pslow->pnext;
free(pslow);
}
11.複製複雜鍊錶
typedef struct randomlistnode randomlistnode;
randomlistnode* clone(randomlistnode* phead)
//複製結點random
for (pnode = phead; pnode; pnode = pnode->next->next)
}//拆鍊錶
randomlistnode *pnewfirst = phead->next;
for (pnode = phead; pnode; pnode = pnode->next)
else
}return pnewfirst;
}
資料結構之鍊錶簡單操作
這是我在學習資料結構的時候,寫的一些簡單 關於鍊錶的簡單操作,可以作為他人學習資料結構的時候參考用 由於寫的比較匆忙,難免有問題,如有問題,歡迎指正!include include struct link 頭插法倒置鍊錶 link headinsert link t return prev 刪除沒有...
資料結構之鍊錶操作
線性表鏈式儲存結構定義 為了表示每個資料元素ai與其後繼資料元素ai 1之間的邏輯關係,對資料元素ai來說,除了儲存其本身資訊外,還需儲存乙個指示其直接後繼的資訊。我們把儲存資料元素的域稱為資料域,把儲存直接後繼位置的域稱為指標域。指標域中儲存的資訊稱為指標或鏈。這兩部分資訊組成資料元素ai的儲存影...
資料結構之鍊錶操作
1 基本概念 鏈式儲存結構不需要用位址連續的儲存單元來實現,而是通過 鏈 建立起資料元素之間的順序關係,因此它不要求兩個在邏輯上相鄰的資料元素在物理邏輯上也相鄰。從而,在插入和刪除元素的時候,不需要對原來的資料元素進行移動,只需要改變鍊錶節點之間的指向關係即可,從而提公升了執行時效率。2 主要儲存結...