链表
什么是链表
是动态地进行存储分配的一种结构,类似于一种功能极其强大的数组,均有一个head头指针指向第一个结点的首地址,第一个指向第二个,一直到最后一个指向空地址(NULL)
(理解:将多个成员用指针的方式从一个成员的末地址指向下一个成员的首地址,从而形成一条类似链子的结构)
其中的成员一般为自定义的结构体
用处:主要可以用于方便数据的插入、增、删、改和查,并可以按照实际需求分配动态空间
struct Student
{
int num;
char c;
struct Student* next;
}
int main()
{
struct a, b, c, *head;
a.num = 100;//一系列赋值
head = &a//头指针指向链表首个结点
a.next = &b;//成员的next指针指向下一位成员的首地址
b.next = &c;
c.next = NULL;//最后记得让末成员的指针域指向空
}
建立动态链表
在代码执行过程中,从有到无建立一条动态链表,伴随结点及结点内数据的开辟
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;//存放下一个结点的指针
};
int main()
{
int i,n;
scanf("%d",&n);
struct node *p,*q,*head=NULL;//head是链表的头指针,通过它找到链表
for(i=0;i<n;i++)
{
p=(struct node *)malloc(sizeof(struct node));//先动态分配内存空间,地址给p
scanf("%d",&(p->data));//p是当前要录入数据的指针
if(head==NULL)head=p;//如果是第一个结点,p赋值给头指针
else q->next=p;//否则把p给上一个结点的next
q=p;//用q记录p,所以在下一个循环中,q是上一个结点的地址
}
p->next=NULL;//最后一个结点当然没有指向啦,所以赋值为空
for(p=head;p!=NULL;p=p->next)//遍历链表
{
printf("%d ",p->data);
}
return 0;
}
一般用malloc函数开辟动态内容
一般对动态分配内存,需要求出结构体所占空间,并根据内存用malloc开辟相对应大小空间
如:
sizeof(struct Student);
- 对于链表的建立,一般用单独的一个自定义函数完成,此时在main函数中调用一下便可建立一条链表同时返回得到链表的头指针
修改链表结点值和输出链表
一般通过一个函数遍历整条链表,同时找到符合条件的结点,同时对结点中的数据进行操作
删除/插入链表结点
删除链表元素就是把前结点的指针域越过需要删除的结点,指向下一个节点
p->next = q->next;
free(q);
增加链表结点便是用上一个结点的指针域指向需要添加结点的首地址,再让新结点的指针域指向下一个结点的首地址
e->next = head->next;
head->next = e;
例子:this指针在成员函数的链式
//c++实现
#include<iostream>
using namespace std;
class Person
{
public:
Person(int age)
{
this->age=age;
}
Person& PersonAddage(Person &p)
{
this->age += p.age;
}
int age;
};
void test()
{
Person p1(10);
Person p2(10);
p2.PersonAddage(p1).PersonAddage(p1).PersonAddage(p1);
cout << " 年龄为 " << p2.age << endl;
}
int main()
{
test();
}