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 刪除乙個無頭單鏈表的非尾結點 ...