本篇文章简单实现了一个单链表的以下功能:
(1)初始化头节点
(2)尾插法(在链表尾部添加一个元素)
(3)在链表中间插入元素
(4)删除链表中任意一个元素
(5)打印链表中的元素
1.准备工作
#include<iostream>
using namespace std;
typedef struct LinkNode {
char data;
struct LinkNode* next;
}LNode, *NodePtr, *LinkList;
2.初始化链表头节点
//初始化头节点,并返回一个结构体指针(头指针)
LinkList initLinkList() {
//malloc一个节点大小的空间,将链表头节点data域初始化为空,next域初始化为空
NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
tempHeader->data = '\0';
tempHeader->next = NULL;
return tempHeader;
}
3.打印链表元素
void printList(NodePtr paraHeader) {
NodePtr p = paraHeader->next;
while (p != NULL) {
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
4.尾插法
void appendElement(NodePtr paraHeader, char paraChar) {
NodePtr p, q;
//q是一个新的节点,用来存放新加入的元素
q = (NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
q->next = NULL;
p = paraHeader;
//将p指向链表末尾
while (p->next != NULL) {
p = p->next;
}
将新节点赋给p的next域
p->next = q;
}
5.任意位置插入新元素
void insertElement(NodePtr paraHeader, char paraChar, int paraPosition) {
NodePtr p, q;
//用for循环将p移动到要加入的位置的前一个节点
p = paraHeader;
for (int i = 0; i < paraPosition; i++) {
p = p->next;
if (p == NULL) {
printf("The position %d is beyond the scope os the list.\n", paraPosition);
return;
}
}
//q为新节点,存放要加入的元素
q = (NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
printf("linking...\n");
//将q与要插入位置后面的节点相连接,再将p与插入的节点相连接
q->next = p->next;
p->next = q;
}
6.删除元素
//删除指定元素(按顺序第一个)
void deleteElement(NodePtr paraHeader, char paraChar) {
NodePtr p, q;
p = paraHeader;
while ((p->next != NULL) && (p->next->data != paraChar)) {
p = p->next;
}
if (p->next == NULL) {
printf("Cannot delete %c\n", paraChar);
return;
}
q = p->next;
p->next = p->next->next;
free(q);
}
7.测试
//测试以上功能
void appendInsertDeleteTest() {
LinkList tempList = initLinkList();
printList(tempList);
appendElement(tempList, 'H');
appendElement(tempList, 'e');
appendElement(tempList, 'l');
appendElement(tempList, 'l');
appendElement(tempList, 'o');
appendElement(tempList, '!');
printList(tempList);
deleteElement(tempList, 'e');
deleteElement(tempList, 'a');
deleteElement(tempList, 'o');
printList(tempList);
insertElement(tempList, 'o', 1);
printList(tempList);
}
//打印地址
void basicAddressTest() {
LNode tempNode1, tempNode2;
tempNode1.data = 4;
tempNode1.next = NULL;
tempNode2.data = 6;
tempNode2.next = NULL;
printf("The first node: %d, %d, %d\r\n",
&tempNode1, &tempNode1.data, &tempNode1.next);
printf("The second node: %d, %d, %d\r\n",
&tempNode2, &tempNode2.data, &tempNode2.next);
tempNode1.next = &tempNode2;
}
int main() {
appendInsertDeleteTest();
}
运行结果