单链表
一,结点构成
struct Node
{
int data;
Node *next;
};
data即为本结点存放数据的地方(定义更多变量,一个结点存的值也就更多),next即为指向下一个,
eg:Node *head; head->data=5;表示head结点存值为5,head->next=NULL,即表示下一个指向为空。
一般头结点的值域都为空,即头结点的data不存值。
而且头结点比较重要,可以穿起来整串链表,所以一般不会对head进行改变,当需要改变时,新定义一个来代替head
二,插入值的方法
1,前插法(插入到头结点后面);
void CreatH(Node *head)
{
int n;
cin >> n; //要新定义几个结点
for (int i = 0; i < n; i++)
{
Node *p = new Node; //定义一新节点存值
cin >> p->data;
p->next = head->next; //将新节点加到头结点后面
head->next = p;
}
}
所以最后将结点p插入到了head和head->next中间
2,后插法(插入到链表末尾):
void CreatB(Node *head) //后插
{
int n;
cin >> n;
Node *p = new Node;
p = head; //定义新节点来代替head进行改变,因为后插法是从链表末尾进行插入
for (int i = 0; i < n; i++)
{
Node *q = new Node;
cin >> q->data;
q->next = p->next;
p->next = q;
p = q;
}
}
二,获得第几个结点的值
void GetI(Node *head, int i)
{
Node *p = new Node;
p = head;
for (int j = 1; j <= i; j++)
{
p = p->next;
}
if (i>1 && p != NULL)
{
cout << p->data<<endl;
}
}
三,返回第几个结点
Node *GetP(Node *head, int i)
{
Node *p = new Node;
p = head;
for (int j = 1; j <= i;j++)
{
p = p->next;
}
return p;
}
四,在第几个结点插入值
void Insert(Node *head, int i, int j)
{
Node *p = new Node;
p=GetP(head, i-1); //此处用到了上面的函数,因为是插入到某结点,所以要获取前一个结点
Node *q = new Node;
q->data = j;
q->next = p->next;
p->next = q;
}
五,删除第几个结点
void Delete(Node *head, int i)
{
Node *p = new Node;
p = GetP(head, i - 1); //同样用到上面函数,找到要删除结点的下一个
Node *q = new Node;
q = p->next;
p->next = q->next;
delete q;
}
六,改变某结点的值
void UpData(Node *head, int i)
{
Node *p = new Node;
p = GetP(head, i); //用上面函数直接获得该节点
cin >> p->data;
}
七,遍历链表
void Show(Node *head) //显示
{
Node *p = new Node;
p = head->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
}
循环链表
只需要一步,即定义头结点的时候,定义为:
Node *head=new Node;
head->next = head;
头结点的下一个指向头结点。
所以此时head结点也是要存值的,不然循环一遍的话,head将会出错。
此时循环终止条件可以写为:
p!=head; 或者 p->next!=head;(相比较与单链表的p!=NULL 或者 p->next !=NULL);
双向链表
一,定义
struct Node
{
int data;
Node *prior;
Node *next;
};
二,数据写入
void Init(Node *head)
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
Node *p=new Node;
cin >> p->data;
p->prior = head->prior;
head->prior->next = p;
head->prior=p;
p->next = head;
}
}
三,删除
关键的两句代码:
p->prior->next = p->next;
p->next->prior = p->prior;