#include<iostream>
using namespace std;
struct Node
{
int data;
Node *next;
};
typedef Node* LinkList;
void init(LinkList *L);
bool insert(LinkList *L, int location, int data);
void show(LinkList L);
bool Delete(LinkList *L, int location);
int main()
{
LinkList List;
init(&List);
for (int i = 1; i <= 10; i++)
{
insert(&List, i, i);
}
show(List);
cout << List->data << endl;
system("pause");
return 0;
}
//初始化的时候,应该制造一个节点
void init(LinkList *L)
{
LinkList s = (LinkList)malloc(sizeof(Node));
s->data = -1;
*L = s;
s->next = *L;
}
bool insert(LinkList *L, int location, int data)
{
//位置问题
if (location < 1)
{
cout << "erro" << endl;
return false;
}
LinkList p = *L;
int j = 1;
p = p->next;//指向头指针
//注意与非循环链表的判断区别
while (p->next!= (*L)->next&&j < location)
{
p = p->next;
j++;
}
//位置大于实际长度
//循环链表的时候,当p所指的链表为空,是可以插入的。
//但是非循环链表,当p所指的地址为空,不可以插入。
if (j!=location)
{
cout << "erro" << endl;
return false;
}
LinkList temp = p->next;
LinkList s = (LinkList)malloc(sizeof(Node));
s->data = data;
p->next = s;
s->next = temp;
if (p == *L)
{
*L = s;
}
}
void show(LinkList L)
{
LinkList p = L->next->next;
cout << "display: ";
while (p != L->next)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
bool Delete(LinkList *L, int location)
{
LinkList p = (*L)->next;//指向头指针
if (p->next == *L|| location<1)
{
cout << "erro" << endl;
return false;
}
int j = 1;
while (p->next != (*L)->next&&j < location)
{
j++;
p = p->next;
}
if (p->next == (*L)->next)
{
cout << "erro" << endl;
return false;
}
LinkList temp = p->next;
p->next = temp->next;
if (temp == *L)
{
*L = p;
}
free(temp);
return true;
}
//链表1的尾节点插在链表2的第一个节点前。链表2的尾节点指向链表1的头节点。将链表2的尾节点作为新链表的尾节点。释放链表2的头节点。
//特别注意的是,链表2不能为空,否则会出错:因为我们要删除链表2的头节点。
//链表1可为空,但是这样做相当于把链表2的地址更改为链表1的地址。
bool emerge(LinkList *L1, LinkList *L2, LinkList *L3)
{
LinkList List2 = *L2;//尾节点
LinkList List1 = *L1;//尾节点
LinkList List1_head = List1->next;//备份链表1的头节点
if (isEmpty(List2) == true)
{
cout << "erro" << endl;
return false;
}
LinkList temp = List2->next;//链表2的头结点
List1->next = temp->next;//链表1的尾节点的next指针指向链表2的首节点
List2->next = List1_head;//链表2的尾节点的next指针指向链表1的头节点
*L3 = List2;//新链表的尾节点为链表2的尾节点
free(temp);
return true;
}