您的位置:首页 > 其它

单链表的实现(包括就地逆转单链表,表排序, 合并单链表、判断表是否有环)

2011-11-14 12:16 549 查看
#include <iostream>
using namespace std;

/////////结点///////
struct Node
{
int data; //数据

Node* next;//下一个结点

};
/////////////单链表/////////

class LinkList
{
public:
void Init();
void Create(int n); //创建带n个数据的单链表

void Dis(); //输出结果

bool Insert(int i, int data); //在索引为i的位置插入数据为data的结点

bool Delete(int i); //删除索引为i的结点

void Destroy(); //销毁链表

int GetLen(); //长度

void Merge(LinkList& list); //归并单链表

void Back(); //就地反转

void Sort(); //排序

bool HaveCircle(); //是否含有环

Node* GetNode(); //获取头结点
private:
Node* head; //头结点

};

///////////////////////单链表实现////////////////

void LinkList::Init()
{
head = new Node();
head->next = NULL;
}
void LinkList::Create(int n)
{
Node* p = head;
for (int i = 1 ; i <= n; ++i)
{
Node* temp = new Node();
temp->data = i ;
temp->next =NULL;
p->next = temp;
p = temp;

}

}

void LinkList::Dis()
{
Node* p = head->next;
while(p)
{
cout<<p->data<<"/t";
p = p->next;
}
cout<<endl;
}

bool LinkList::Insert(int i, int data)
{
if (i <0 || i > GetLen())
{
return false;
}
Node* p = head;
Node* q = head;
for (int j = 0; j<i; j++)
{
q = p->next;
p = p->next;

}
Node* InsertNode = new Node;
InsertNode->data = data;
InsertNode->next = q->next;
q->next = InsertNode;
return true;
}

bool LinkList::Delete(int i)
{
if (i < 0 || i >= GetLen())
{
return false;
}
Node* p = head;
Node* q = head;

for (int j = 0; j<i; j++)
{
q = p->next;
p = p->next;

}
Node* DelNode = q->next;
q->next = DelNode->next;
delete DelNode;
return true;

}

void LinkList::Destroy()
{
Node* p = head->next;

while(p)
{
Node* temp = p;
p = p->next;
delete temp;
}
delete head;
head->next = NULL;

}

int LinkList::GetLen()
{
int count = 0;
Node* p = head->next;
while(p)
{
p = p->next;
++count;
}
return count;
}
void LinkList::Merge(LinkList& list)
{

Node* p = head->next;
while (p->next)
{
p = p->next;
}
Node* listNode = list.GetNode();
p->next = listNode->next;

}

Node* LinkList::GetNode()
{
return head;
}

void LinkList::Sort()
{
//选择排序
Node* p = head->next;
while(p)
{
Node* small = p;
Node* q = p->next;
while(q)
{
if (q->data < small->data)
{
small = q;

}

q = q->next;
}

if (p != small)
{
int temp;
temp = p->data;
p->data = small->data;
small->data = temp;
}

p = p->next;
}

}

void LinkList::Back()
{
/*先把原来的链表头结点断开
*建立一个新的链表,然后把原来的链表插入到新链表的头部
*最后把原来链表头部指向新链表,最后注意要释放新链表的头部
*也就是最后一个元素**************************************/
LinkList tempList;
tempList.Init();
Node* TempNode = tempList.GetNode();
Node* n = TempNode;
Node* p = head->next;
while(p)
{
Node* q = p->next;
Node* temp = p;
temp->next = TempNode;
temp->data = p->data;
TempNode = temp;
p = q;

}

head->next = TempNode;
Delete(GetLen() - 1);

}

bool LinkList::HaveCircle()
{
Node* p = head;
Node* q = head;
while ((p->next != NULL) && (q->next != NULL) && (q->next->next != NULL) )
{
p = p->next;
q = q->next->next;
if (p == q)
{
return true;
}
}

return false;

}

int main()
{
LinkList list;
list.Init();
list.Create(4);
LinkList list1;
list1.Init();
list1.Create(5);
list.Merge(list1);
list.Dis();
list1.Dis();
list1.Back();
list1.Dis();
list1.Sort();
list1.Dis();
cout<<list.HaveCircle()<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐