/* 本程序在VisualStudio2017上编译通过 */
#include<iostream>
#include<cstdio>
#define null NULL
using namespace std;
//循环单链表
typedef struct Node
{
int data;
Node *next;
}Node;
//初始化(尾插法)
Node *init(int *num, int len)
{
Node *head = new Node;
head->next = null;
Node *p = head;
for (int i = 0; i < len; ++i)
{
Node *t = new Node;
t->data = num[i];
t->next = null;
p->next = t;
p = p->next;
}
p->next = head;
return head;
}
//初始化(头插法)
Node *init2(int *num, int len)
{
Node *head = new Node;
head->next = null;
Node *m = null;
for (int i = 0; i < len; ++i)
{
Node *t = new Node;
t->data = num[i];
t->next = head->next;
if (i == 0)
m = t;
head->next = t;
}
m->next=head;
return head;
}
//插入
void insert(Node *head,int index,int e)
{
Node *p = head;
int i = 0;
while (p->next!=head&&i < index)
{
p = p->next;
++i;
}
if (index>i||p->next==head)
return;
Node *t = new Node;
t->data = e;
t->next = p->next;
p->next = t;
}
//删除
int remove(Node *head, int index)
{
int i = 0;
Node *p = head;
while (p->next != head && i < index)
{
p = p->next;
i++;
}
if (index > i || p->next == head)
return -1;
Node *q = p->next;
int n = q->data;
p->next = q->next;
delete(q);
return n;
}
//查找(根据索引)
int search1(Node *head, int index)
{
Node *p = head;
int i = 0;
while (p->next != head && i < index)
{
p = p->next;
++i;
}
if (index > i || p->next == head)
return -1;
return p->next->data;
}
//查找(根据值)
int search2(Node *head, int e)
{
Node *p = head;
int i = 0;
while (p->next != head)
{
p = p->next;
if (p->data == e)
return i;
++i;
}
return -1;
}
//逆序
Node *reverse(Node *head)
{
Node *p = head->next;
Node *q = head;
while (p != head)
{
Node *t = p->next;
p->next = q;
q = p;
p= t;
}
head->next = q;
return head;
}
//遍历
void view(Node *head)
{
Node *p = head;
while (p->next != head)
{
p = p->next;
cout << p->data << " ";
}
cout << endl;
}
//整表删除
void deleteAll(Node *head)
{
Node *p = head;
while (p->next != head)
{
Node *q = p->next;
p->next = q->next;
delete(q);
}
delete(head);
}
int main(void)
{
int num[] = { 1,2,5,6,8 };
Node *p = init2(num, 5);
view(p);
reverse(p);
view(p);
deleteAll(p);
system("pause");
return 0;
}