資料結構之鍊錶的簡單操作及相關面試題

2021-08-20 20:23:36 字數 4906 閱讀 5793

簡單實現鍊錶的基本操作:初始化,銷毀,增刪改查等操作。

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 主要儲存結...