首先把源码放上来吧。其实在基础结构篇讲的 最基础的索引方式就两种 一种是下标式索引,一种是地址(指针)式索引。对就这些。对于很多人来说应该看源码会更清晰些,但是很多人可能更喜欢看图片。
还是想这么说,其实无关乎语言,你有编程的能力就可以把一切用语言让计算机表达出来,
就像写一个数组;
int a【10】;
int *b=new int[10];
一个人的类(当然懒得写class)
struct person{
int age;
int height;
string name;
};
创造一个p1的人(对象)和100个人
person p1;
person *p2=new person[100];
离题了
#include<iostream>
template<class T>
struct node {
T data;
node* next;
node(T i) :data(i), next(NULL) {}
node() :data(0), next(NULL) {}
};
template<class T>
class linklist {
private:
int size;
node<T>* head;
public:
linklist() :size(0), head(NULL) {}
~linklist();
void add_data(int i, T data);
void delete_data(int i);
void print();
};
template<class T>
linklist<T>::~linklist()
{
node<T>* curr = head;
for (int i = 0; i < size; ++i)
{
node<T>* temp = curr;
curr = curr->next;
delete temp;
}
}
template<class T>
void linklist<T>::add_data(int i, T data)
{
node<T>* newnode = new node<T>(data);
if (i == 0)
{
head = newnode;
size++;
}
else
{
node<T>* curr = head;
for (int j = 0; j < i-1; ++j)
{
curr = curr->next;
}
newnode->next = curr->next;
curr->next = newnode;
size++;
}
}
template<class T>
void linklist<T>::delete_data(int i)
{
node<T>* curr = head;
for (int j = 0; j < i - 1; ++j)
{
curr = curr->next;
}
node<T>* temp = curr->next;
curr->next = temp->next;
delete temp;
size--;
}
template<class T>
void linklist<T>:: print()
{
node<T>* curr = head;
while (curr)
{
std::cout << curr->data << std::endl;
curr = curr->next;
}
}
int main()
{
linklist<int> list1;
list1.add_data(0, 9);
list1.add_data(1, 7);
list1.add_data(2, 5);
list1.add_data(3, 8);
list1.print();
std::cout << "................." << std::endl;
list1.delete_data(2);
list1.print();
std::cin.get();
}
你可以从析构函数看得到其实他都是一个在堆上开的内存。
template<class T>
void linklist<T>::add_data(int i, T data)
{
node<T>* newnode = new node<T>(data);
if (i == 0)
{
head = newnode—>next;
head=newnode;
size++;
}
else
{
node<T>* curr = head;
for (int j = 0; j < i-1; ++j)
{
curr = curr->next;
}
newnode->next = curr->next;
curr->next = newnode;
size++;
}
}
首先就从增加上来看吧,
我画的有点丑但是很好理解 一个新的结点 如果头插法,就是把他的next指向头节点,如果是别的就索引到那个上一个位置将那个next 指向我们要插入的结点,而我们插入的结点指向下一个结点,当然要先做下一个结点给我的新结点,不然你的链表就断了;
head头结点,你可以理解为第一个结点,next指针我画的直线curr则是去找到的索引。
template<class T>
void linklist<T>::delete_data(int i)
{
node<T>* curr = head;
for (int j = 0; j < i - 1; ++j)
{
curr = curr->next;
}
node<T>* temp = curr->next;
curr->next = temp->next;
delete temp;
size--;
}
和增加一样curr去找到目标值前一个,temp是curr当前后一个,然后将temp的后一个给curr后一个
删除temp。