1. 创建结构体
2. 头插法创建单链表
3.尾插法创建单链表
4.查找并且删除链表中的数字
5.遍历显示单链表元素
6.Main测试主函数
定义结构体:
typedef struct LNode {
int data;
struct LNode* next;
}LNode;
头插法创建单链表:
LNode* HeadInsert() {
LNode* head = (LNode*)malloc(sizeof(LNode));
LNode* p;
head->next = NULL;//头结点指针初始化
for (int i = 0; i < 10; i++)//循环插入,这里为方便直接循环插入数据
{
LNode* x = (LNode*)malloc(sizeof(LNode));
x->data = i;
x->next = head->next;
head->next = x;
}
return head;
}
尾插法创建单链表:
LNode* TailInsert() {
LNode* head = (LNode*)malloc(sizeof(LNode));
LNode* p;
head->next = NULL;//头结点指针初始化
p = head;//用p指针帮忙插入数据,head指针在头结点上当领导就可以了
for (int i = 0; i < 10; i++)
{
LNode* x = (LNode*)malloc(sizeof(LNode));
x->data = i;
p->next = x;
x->next = NULL;
p = x;
}
return head;
}
查找并且删除链表中的数字,成功返回一,没有这个数字就返回0
int SearchAndDelete(LNode* List, int x) {
LNode* p;
p = List;
while (p->next != NULL)
{
if (p->next->data == x)
{
p->next = p->next->next;
return 1;
}
p = p->next;
}
return 0;
}
遍历显示单链表元素
void Show(LNode* lnode) {
LNode* p;
p = lnode;
while (p->next != NULL)
{
cout << p->next->data << " ";
p = p->next;
}
cout << endl;
}
Main测试主函数
int main() {
LNode* A = HeadInsert();
LNode* B = TailInsert();
cout << "头插法生成的链表:";
Show(A);
cout << "尾插法生成的链表:";
Show(B);
cout << "A表删除值为6的元素后的链表:";
Show(A);
return 0;
}
结果
头插法生成的链表:9 8 7 6 5 4 3 2 1
尾插法生成的链表:0 1 2 3 4 5 6 7 8 9
A表删除值为6的元素后的链表:9 8 7 6 5 4 3 2 1
可以看到头插法生成的链表顺序是和插入顺序相反的,尾插法生成的链表顺序是和插入顺序相同。结合插入过程,头插法见名知意就是在头部插入,其他元素往队伍头上插队。尾插法往队伍尾巴上面添加自己,从而导致插入顺序与位置顺序不一致