算法笔记习题 7-3小节
算法笔记@Ada_Lake
算法笔记代码保留地~~~
7.3——数据结构专题(1)-> 链表处理
链表的基本操作
1.创建链表
- 创建链表结点
- 创建链表
1.建立一个数据域
2.将这个数据域放到创建的链表中
1.将数据传到要创建的链表中
2.创建一个头结点
3.让其指针域初始为NULl
4.头结点和其头指针是一直不能动的,就要再创建一个指针先放在头结点的位置,好让其一会连接头结点与第一个结点
5.再创建一个结点,让其将刚刚进来的数据传入。让其的指针域设为NULL。
6.让刚刚的中介结点的指针域指向现在的结点。因为目前中介结点在头结点的位置。因此头结点也连接上了
7.让中介结点现在移动已经连接到的结点的位置,一会继续往后连
先创建头结点,再创建有数据的结点。通过中介指针将其连接起来- 创建一个结点指针,让创建的链表的头指针指向结点指针
4.让该结点从第一个结点开始,直至为空。输出L里的所有数据
// Ada
#include<stdio.h>
struct node {
int data; //数据域
node* next; //指针域
};
node* create(int array[]) {
node *p, *pre, *head; //创建 结点,中介, 头三个指针
head = new node; // 创建头结点
head -> next = NULL; // 让头节点的指针域先初始为0
pre = head; // 让中介放在头指针的位置
for( int i = 0; i < 5; i++ ) {
p = new node; //创建数据结点
p -> data = array[i]; // 放入结点的数据
p -> next = NULL; // 结点的指针域初始为0
pre -> next = p; //中介联系起头指针和结点指针
pre = p;
}
return head;
}
int main() {
int array[5] = {1, 2, 3, 4, 5};
node* L = create(array);
L = L->next;
for(int i = 0; i < 5; i++) {
printf("%d ", L->data);
L = L->next;
}
return 0;
}
2.查找元素
1.传入链表,要查找的数
2.在没有到达尾部之前,从第一个结点遍历,如果找到了就计数加1
// Ada
int search(node* head, int n) {
node* p = head->next;
int count = 0;
while(p != NULL) {
if( p -> data == n) {
x++;
}
p = p-> next;
}
return count;
}
3.插入元素
- 传入链表,要插入的位置,要插入的元素
- 让指针指向第一个结点,只要没有到插入位置的前一个,就继续向后找
- 创建一个结点,让这个结点指向目前位置的下一个
- 让前一个位置的结点指向目前这个结点
// Ada
void insert(node* head, int n, int a) {
node* p = head;
for(int i = 0; i < n - 1; i++ ) {
p = p->next; //到达插入位置的前一个结点
}
node* q = new node; //新建结点
q -> data = n; //新结点指针域为n
q ->next = p->next; //新结点的下一个结点指向原先插入位置的结点
p -> next = q; //前一个位置的结点指向新结点
}
4.删除元素
- 传入链表和要删除的元素
- 让一个指针指向要找到的那个数,一个指针指向这个数的前一个位置
- 在链表未走完之前,若找到了那个数,
1.把现在的指针指向的下一个赋给它的前驱指向的下一个,将这个指针删除。让目前的前驱结点的下一个为现在的p
2.否则就让这个指针赋给前驱,它的下一个赋给自己。
// Ada
void del(node* head, int n) {
node* p = head-> next;
node* pre = head;
while(p != NULL) {
if(p -> data == n) {
pre->next = p->next;
delete(p);
p = pre->next; //注意这里!!!
}
else {
pre = p;
p = p->next;
}
}
}