#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __SLIST_H__
#define __SLIST_H__
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
typedef int DataType;
typedef struct SList
{
struct SList* pNext;
DataType data;
}SList;
//初始化
void Init(SList **ppHead);
//创建新的空间
static SList* BuyNewNode(DataType data);
//销毁
void Destroy(SList* *ppHead);
//头插
void pushfront(SList* *ppHead,DataType data);
//尾插
void pushback(SList* *ppHead,DataType data);
//查找
SList *Find(SList *pHead,DataType data);
//指定位置插
void insert(SList **ppHead,SList *pPosNode,DataType data);
//头删
void popfront(SList **ppHead);
//指定位置删
void popPos(SList **ppHead,SList *pPosNode);
//按值删除,删除第一个找到的
void Remove(SList **ppHead,DataType data);
//按值删除,删除所有的
void RemoveAll(SList **ppHead,DataType data);
//计算链表的数量
int Size(SList **ppHead);
//打印
void Print(SList* pHead);
//面试题
//从尾到头打印链表
void RreversePrintD(SList* pHead);//递归
void RreversePrint(SList* pHead);//循环
//逆置/反转单链表
SList* Reverse(SList* pFirst); //改变箭头方向
SList* Reverse1(SList* pFirst); //头删、头插
//删除一个无头单链表的非尾节点(不能遍历链表)
void PopNoBack(SList* pPos);
//在无头单链表的一个节点前插入一个节点(不能遍历链表)
void PushNoBack(SList* pPos,DataType data);
//单链表实现约瑟夫环
int JosCircle(SList* pFirst,int k);
//单链表排序(冒泡法)
void BubbleSort(SList* pFirst);
//合并两个有序链表,合并后依然有序
SList* SortList(SList* pOneFirst, SList* pTwoFirst);
//查找单链表中的中间结点,要求只能遍历一次链表
int FindMid(SList* pFirst);
//查找单链表中的倒数第k个结点,要求只能遍历一次链表
int Findk(SList* pFirst,int k);
//删除单链表中的倒数第k个结点
void Popk(SList* pFirst,int k);
//求两个已排序链表中的相同数据
int UnionSet(SList* pOneFirst, SList* pTwoFirst);
//判断两个链表是否相交,若相交,求交点(假设链表不带环)
int HasCrossWithoutCircle(SList *pOneFirst, SList *pTwoFirst);
//判断单链表是否带环,若带环,求环的长度,求环的入口点
void test();
void testBubbleSort();
void testSortList();
void testFindMid();
void testFindk();
void testPopk();
void testUnionSet();
void testHasCrossWithoutCircle();
#endif //__SLIST_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include"slist.h"
//³õʼ»¯
void Init(SList * *ppHead)
{
*ppHead = NULL;
}
//´´½¨ÐµĿռä
static SList* BuyNewNode(DataType data)
{
SList* pNewNode;
pNewNode = (SList*)malloc(sizeof(SList));
assert(pNewNode);
pNewNode->data = data;
pNewNode->pNext = NULL;
return pNewNode;
}
//Ïú»Ù
void Destroy(SList* *ppHead)
{
SList *pNode;
SList *pNext = NULL;
for(pNode=*ppHead; pNode!=NULL; pNode=pNext)
{
free(pNode);
pNode = NULL;
}
}
//Í·²å
void pushfront(SList* *ppHead,DataType data)
{
SList* pNewNode;
pNewNode = BuyNewNode(data);
pNewNode->pNext = *ppHead;
*ppHead = pNewNode;
}
//β²å
void pushback(SList* *ppHead,DataType data)
{
SList* pNode = *ppHead;
SList* pNewNode = BuyNewNode(data);
if(pNode == NULL)
{
pNode = pNewNode;
pNode->pNext = NULL;
*ppHead = pNode;
return;
}
while(pNode->pNext != NULL)
{
pNode = pNode->pNext;
}
pNewNode->pNext = pNode->pNext;
pNode->pNext = pNewNode;
}
//²éÕÒ
SList *Find(SList *pHead,DataType data)
{
SList *pNode = pHead;
while(pNode != NULL)
{
if(pNode->data == data)
return pNode;
pNode = pNode->pNext;
}
return NULL;
}
//Ö¸¶¨Î»Öòå
void insert(SList **ppHead,SList *pPosNode,DataType data)
{
SList *pNewNode = BuyNewNode(data);
SList *pNode = *ppHead;
assert(*ppHead != NULL);
if(pNode == pPosNode)
{
pushfront(&pNode,data);
return;
}
while(pNode->pNext != pPosNode)
{
pNode = pNode->pNext;
}
pNewNode->pNext = pPosNode;
pNode->pNext = pNewNode;
}
//ͷɾ
void popfront(SList **ppHead)
{
SList *pNode = *ppHead;
if(*ppHead == NULL)
{
printf("ÎÞÐèɾ³ý\n");
return;
}
*ppHead = pNode->pNext;
free(pNode);
pNode = NULL;
}
//βɾ(ÕÒµ½µ¹ÊýµÚ¶þ¸ö)
void popback(SList **ppHead)
{
SList *pNode = *ppHead;
SList *pNext = NULL;
if(*ppHead == NULL)
{
printf("ÎÞÐèɾ³ý\n");
return;
}
while(pNode->pNext->pNext != NULL)
{
pNode = pNode->pNext;
}
pNext = pNode->pNext;
pNode->pNext = NULL;
free(pNext);
pNext = NULL;
}
//Ö¸¶¨Î»ÖÃɾ
void popPos(SList **ppHead,SList *pPosNode)
{
SList *pNode = *ppHead;
if(*ppHead == NULL)
{
printf("ÎÞÐèɾ³ý\n");
return;
}
if(pNode == pPosNode)
{
popfront(ppHead);
return;
}
while(pNode->pNext != pPosNode)
{
pNode = pNode->pNext;
}
pNode->pNext = pPosNode->pNext;
free(pPosNode);
pPosNode = NULL;
}
//°´ÖµÉ¾³ý£¬É¾³ýµÚÒ»¸öÕÒµ½µÄ
void Remove(SList **ppHead,DataType data)
{
SList *pDel = NULL;
if(*ppHead == NULL)
{
printf("ÎÞÐèɾ³ý\n");
return;
}
pDel = Find(*ppHead,data);
popPos(ppHead,pDel);
}
//°´ÖµÉ¾³ý£¬É¾³ýËùÓеÄ
void RemoveAll(SList **ppHead,DataType data)
{
SList *pNode = *ppHead;
SList *pDel = NULL;
if(*ppHead == NULL)
{
printf("ÎÞÐèɾ³ý\n");
return;
}
while(pNode->pNext != NULL)
{
while(pNode->pNext->data != data)
{
pNode = pNode->pNext;
}
pDel = pNode->pNext;
pNode->pNext = pDel->pNext;
free(pDel);
pDel = NULL;
}
if((*ppHead)->data == data)
{
pNode = *ppHead;
*ppHead = pNode->pNext;
free(pNode);
pNode = NULL;
}
}
//¼ÆËãÁ´±íµÄÊýÁ¿
int Size(SList **ppHead)
{
int size = 0;
SList *pNode = *ppHead;
while(pNode != NULL)
{
size++;
pNode = pNode->pNext;
}
return size;
}
//´òÓ¡
void Print(SList* pHead)
{
SList* pNode;
for(pNode=pHead; pNode!=NULL; pNode=pNode->pNext)
{
printf("%d->",pNode->data);
}
}
//´Óβµ½Í·´òÓ¡Á´±í
void RreversePrintD(SList* pHead)
{
SList* pNode = pHead;
if(pNode == NULL)
{
printf("<-NULL");
return;
}
if(pNode->pNext == NULL)
{
printf("<-%d",pNode->data);
return;
}
if(pNode->pNext != NULL)
{
RreversePrintD(pNode->pNext);
printf("<-%d",pNode->data);
}
}
void RreversePrint(SList* pHead)
{
SList* pNode = pHead;
SList* pEnd = NULL;
if(pNode == NULL)
{
printf("<-NULL");
return;
}
while(pEnd != pHead)
{
for(pNode = pHead;pNode->pNext != pEnd;pNode = pNode->pNext)
{
;
}
printf("<-%d",pNode->data);
pEnd = pNode;
}
}
//ÄæÖÃ/·´×ªµ¥Á´±í
SList* Reverse(SList* pFirst)
{
SList* p1 = NULL;
SList* p2 = pFirst;
SList* p3 = p2->pNext;
while(p2 != NULL)
{
p2->pNext = p1;//¸Ä±ä¼ýÍ··½Ïò
p1 = p2;
p2 = p3;
if(p2 != NULL)
{
p3 = p2->pNext;
}
}
return p1;
}
SList* Reverse1(SList* pFirst) //ͷɾ¡¢Í·²å
{
SList* pNode = pFirst;
SList* pNew = NULL;
SList* pNext = NULL;
assert(pFirst != NULL);
while(pNode != NULL)
{
pNext = pNode->pNext;
pushfront(&pNew,pNode->data);
pNode = pNext;
}
return pNew;
}
//ɾ³ýÒ»¸öÎÞÍ·µ¥Á´±íµÄ·Çβ½Úµã£¨²»ÄܱéÀúÁ´±í£©
void PopNoBack(SList* pPos)
{
SList* pNext;
assert(pPos != NULL);
assert(pPos->pNext != NULL);
pNext = pPos->pNext;
pPos->data = pNext->data;
pPos->pNext = pNext->pNext;
free(pNext);
}
//ÔÚÎÞÍ·µ¥Á´±íµÄÒ»¸ö½ÚµãÇ°²åÈëÒ»¸ö½Úµã£¨²»ÄܱéÀúÁ´±í£©
void PushNoBack(SList* pPos,DataType data)
{
SList*pNode;
assert(pPos != NULL);
pNode = BuyNewNode(pPos->data);
if(pPos == NULL)
{
pushfront(&pPos,data);
return;
}
pPos->data = data;
pNode->pNext = pPos->pNext;
pPos->pNext = pNode;
}
//µ¥Á´±íʵÏÖԼɪ·ò»·
int JosCircle(SList* pFirst,int k)
{
SList* pCur = pFirst;
SList* pPrev = NULL;
int i=0;
assert(pFirst != NULL);
while(pCur->pNext != NULL)
{
pCur = pCur->pNext;
}
pCur->pNext = pFirst;//½«µ¥Á´±íÁ¬³É»·
pCur = pFirst;
while(pCur->pNext != pCur)
{
for(i = 0; i < k-1; i++)
//ËäȻҪɱÊÇÑ»·k´Î£¬µ«ÊÇÒª¸ü¸ÄÁ´±í£¬ÒªÕÒµ½Ç°Ò»¸ö£¬ËùÒÔk-1
{
pPrev = pCur;
pCur = pCur->pNext;
}
//kill
pPrev->pNext = pCur->pNext;
free(pCur);
//Ö¸ÏòÔÀ´µÄÏÂÏÂÒ»¸ö£¨ÏÖÔÚµÄÏÂÒ»¸ö£©
pCur = pPrev->pNext;
}
return pCur->data;
}
void test()
{
SList* psL = NULL;
//SList* ret;
int ret1 = 0;
Init(&psL);
pushback(&psL,1);
pushback(&psL,3);
pushback(&psL,5);
pushback(&psL,7);
pushback(&psL,2);
Print(psL);
printf("\n");
/*pushfront(&psL,4);
pushfront(&psL,3);
pushfront(&psL,2);
pushfront(&psL,1);
Print(psL);
printf("\n");*/
//insert(&psL,Find(psL,6),45);
//popfront(&psL);
//popback(&psL);
//popPos(&psL,Find(psL,6));
//Remove(&psL,3);
//RemoveAll(&psL,3);
//RreversePrintD(psL);
//RreversePrint(psL);
//ret = Reverse(psL);
//Print(ret);
//ret = Reverse1(psL);
//PopNoBack(Find(psL,2));
//PushNoBack(Find(psL,3),23);
//Print(psL);
//ret1 = JosCircle(psL,3);
//printf("%d\n",ret1);
Destroy(&psL);
}
#define _CRT_SECURE_NO_WARNINGS 1
#include"slist.h"
int main()
{
//test();
//testBubbleSort();
//testSortList();
testFindMid();//ÓÐÎÊÌâ
//testFindk();
//testPopk();
//testUnionSet();
//testHasCrossWithoutCircle();
return 0;
}
链表面试题
最新推荐文章于 2022-11-04 18:01:21 发布