如图所示 单项链表节点有两个域:指针域与数据域 定义如下:
typedef int dataType;
class node {
friend class nodeList;
private:
dataType data; //数据域
node* link; //指针域 一个指向下一个元素的指针
};
同时拥有一个节点链表用来存储数据:定义如下
class nodeList {
private:
node* first; //头节点指针
public:
nodeList() { first = 0; }
void add(dataType num); //从链表头部按顺序添加
void insertTail(dataType num); //连接到尾部
void mediumInsert(dataType num, int pos);
void Delete(dataType num); //删除一个值
void show();
};
通过指针遍历整个链表:
void nodeList::show() {
node* p = new node();
p = first; //指向第一个节点
while (p != NULL) {
dataType temp = p->data;
cout << temp << " ";
p = p->link; //数据迭代
}
cout << endl;
}
增加一个新的节点:
void nodeList::add(dataType num) {
node* newNode = new node(); //创建一个新节点
newNode->data = num;
newNode->link = first; //新节点的指针域指向下一个节点
first = newNode; //新的节点标记为头节点
}
插入到尾部:
void nodeList::insertTail(dataType num) {
//新的节点
node* newNode = new node();
newNode->data = num;
//用来遍历
node* p = new node();
p = first;
while (p->link != NULL) {
p = p->link;
}
newNode->link = p->link; //尾部插入法
p->link = newNode;
}
中间插入和尾部插入没什么区别 只是迭代到指定的位置然后进行插入操作
//中插
void nodeList::mediumInsert(dataType num, int pos) {
node* newNode = new node();
newNode->data = num;
node* p = new node();
p = first;
int k = 1; //标记节点位置
while (p->link != NULL && k < pos - 1) {
p = p->link;
k++;
}
newNode->link = p->link;
p->link = newNode;
}
删除操作:
void nodeList::Delete(dataType num) {
node* p = new node(); //第一个指针
node* q = new node(); //第二个指针
p = first;
q = NULL;
if(p == NULL){
return;
}
if (p->data == num) { //判断首个节点是不是要删除的节点
first = first -> link;
delete p; //删除节点
return;
}
else {
//开始进行遍历
while (p != NULL) {
q = p; //
q = q->link;
if (q->data == num) {
p->link = q->link;
delete q;
break;
}
p = p->link;
}
}
}