鏈表面試題(上)

2021-08-15 03:53:54 字數 4799 閱讀 3182

slistnode.h

#ifndef _slistnode_h_

#define _slistnode_h_

#include#include#include#include#includetypedef int datatype;

typedef struct slistnode

slistnode;

slistnode* init();

slistnode* buyslistnode(datatype x);

void slistprint(slistnode* phead);

void slistdestory(slistnode** pphead);

void slistpushback(slistnode** pphead, datatype x);

void slistpopback(slistnode** pphead);

void slistpushfront(slistnode** pphead, datatype x);

void slistpopfront(slistnode** pphead);

slistnode* slistfind(slistnode* phead, datatype x);

void slistinsert(slistnode** pphead, slistnode* pos, datatype x);

void slisterase(slistnode** pphead, slistnode* pos);

//test*************

void test1();

void test2();

void test3();

void testadddel();

void testjosephcircle();

void testslistreverse();

void testslistbubblesort();

void testslistmerge();

void testslistfindmidnode();

void testslistfindtailknode();

//********************

//鏈表面試題

void slitsprinttailtohead(slistnode* phead) ;

void slistprinttailtoheadr(slistnode* phead) ;

void slistdelnontailnode(slistnode* pos) ;

void slistinsertfrontnode(slistnode* pos, datatype x) ;

slistnode* slistjosephcircle(slistnode* phead, int k) ;

slistnode* slistreverse(slistnode* list) ;

void slistbubblesort(slistnode* list) ;

// 公升序

slistnode* slistmerge(slistnode* list1, slistnode* list2) ;

slistnode* slistfindmidnode(slistnode* list) ;

slistnode* slistfindtailknode(slistnode* list, size_t k) ;

#endif

slistnode.c

#include"slistnode.h"

//初始化

slistnode* init()

//建立乙個結點

slistnode* buyslistnode(datatype x)

//列印單鏈表

void slistprint(slistnode* phead)

printf("\n");

}//銷毀

void slistdestory(slistnode** pphead)

}//尾插;

void slistpushback(slistnode **pphead, datatype x)

cur->_next=newnode;

}//尾出

void slistpopback(slistnode** pphead)

pr=cur=*pphead;

assert(pphead);

while(cur->_next)

free(cur);

pr->_next=null;

}//頭入

void slistpushfront(slistnode** pphead, datatype x)

//頭出

void slistpopfront(slistnode** pphead)

temp = head = *pphead;

temp = temp->_next;

head->_next = temp->_next;

free(temp);

}//查詢值為x的節點

slistnode* slistfind(slistnode* phead, datatype x)

cur = cur->_next;

} return null;

}//在pos節點前插入乙個值為x的節點

void slistinsert(slistnode** pphead, slistnode* pos, datatype x)

if(cur)

}//刪除指定節點

void slisterase(slistnode** pphead, slistnode* pos)

pr->_next = cur->_next;

free(cur);

}

viewtest.c

#include"slistnode.h"

//從尾到頭列印單鏈表 (非遞迴)

void slitsprinttailtohead(slistnode* phead)

printf("%d ",cur->_data);

tail = cur;

} printf("\n");

}//從尾到頭列印單鏈表 (遞迴)

void slistprinttailtoheadr(slistnode* phead)

//刪除乙個無頭單鏈表的非尾節點(不能遍歷鍊錶)

void slistdelnontailnode(slistnode* pos)

//在無頭單鏈表的乙個節點前插入乙個節點(不能遍歷鍊錶)

void slistinsertfrontnode(slistnode* pos, datatype x)

//列印環形鍊錶

void printclist(slistnode* phead)

printf("\n");

}//單鏈表實現約瑟夫環(josephcircle)

slistnode* slistjosephcircle(slistnode* phead, int k)

cur->_next = phead->_next; //鏈結為環

cur = cur->_next;

i = k;

j = 1;

while(cur!=cur->_next)

cur = cur->_next;

} return cur;

}//逆置/反轉單鏈表

slistnode* slistreverse(slistnode* list)

tail =cur;

} return list;

}//單鏈表排序(氣泡排序&快速排序)

void slistbubblesort(slistnode* list)

cur = cur->_next;

} if(flag==0)

return ;

tail = cur; }}

//void quicksort(slistnode* list)

// 並歸公升序

slistnode* slistmerge(slistnode* list1, slistnode* list2)

else

} while(cur1)

while(cur2)

return newlist;

}//找到中間結點

slistnode* slistfindmidnode(slistnode* list)

return slownode;

}//找到倒數第k個結點

slistnode* slistfindtailknode(slistnode* list, size_t k)

return slow;

}//從尾到頭列印單鏈表

void test3()

//無頭節點的增加刪除

void testadddel()

//測試約瑟夫環

void testjosephcircle()

//測試單鏈表逆置

void testslistreverse()

void testslistbubblesort()

void testslistmerge()

void testslistfindmidnode()

void testslistfindtailknode()

main.c

#include"slistnode.h"

int main()

鏈表面試題(上)

slistnode.h ifndef slistnode h define slistnode h include include include include includetypedef int datatype typedef struct slistnode slistnode slist...

鏈表面試題

不改變鍊錶結構,從尾到頭列印單鏈表 遞迴實現 void printlistrevers recursively plist phead printf d phead data 當鍊表非常長的時候,遞迴實現的會導致函式呼叫層級很深,可能導致呼叫棧溢位。用棧不會出現此類情況,顯然用棧實現 的魯棒性會好一...

鏈表面試題

從尾到頭列印單鏈表 棧 遞迴 從尾到頭列印鍊錶 includevoid printtailtohead listnode head while s.empty 空間複雜度o n void printtailtoheadr listnode head cout data 刪除乙個無頭單鏈表的非尾結點 ...