链表的基本操作
#include<stdio.h> #include<stdlib.h> struct node { int data; node* next; };//定义链表节点
(一)创建链表
node* create(int* Array) { node* p, * head, * pre; int k = 0; scanf("%d", &k); head =new node; head->next = NULL; pre = head; for (int i = 0; i <k; i++) { p = new node; //创建一个新的节点 scanf("%d", &Array[i]); //输入数组元素 p->data = Array[i]; //将数组元素赋值 p->next = NULL; //将新节点的指针域设为NULL pre->next = p; //前一个节点的指针域设为当前新建节点的地址 pre = p; //将pre设为p,作为下一个节点的前驱节点 } return head;//返回头结点指针 }
(二)查找元素
int search(node* head, int x) { int count=0; node* p = head->next;//从第一个节点开始查找 while (p != NULL) {//只要还未到链表末尾 if (p->data == x) { count++; } p = p->next; } return count; }
这一部分代码可以将create函数返回的头指针L直接作为第一个参数传入即可
(三)插入元素
void insert(node* head, int pos, int x) {//将x插入到以head为头结点的链表的第pos个位置上(不是pos位置) node* p = head; for(int i=0;i<pos-1;i++){ p = p ->next; }//最后p为插入节点的前一个位置。 node* q = new node;//新建节点。 q->data = x; q->next = p->next;//新节点的下一个节点指向原先插入位置的节点。 p ->next = q;//插入位置前的一个节点指向这个新插入的节点。 }
这份代码可以直接把create函数返回的头指针L直接作为第一个参数传入即可。
(四)删除元素
void del(node* head, int x) {//删除以head为头结点的链表中所有数据域为x的节点 node* p = head->next; node* pre = head;//pre始终保存p的前驱节点的指针 while (p != NULL) { if (p->data == x) { pre->next = p->next;//关键点,在删除元素的时候,pre是不用动的,一定不要写成pre= p-> next delete(p); p = pre->next; } else {//如果数据域不是x,把p与pre都后移一位。 pre = p; p = p->next; } } }
同样这份代码可以直接把create函数返回的头指针L直接作为第一个参数传入即可
主函数:
int main() { const int n = 100;//定义数组范围 int Array[n] = {0}; node* L = create(Array); L = L->next; while (L != NULL) { printf("%d ", L->data); L = L->next; } return 0; }

浙公网安备 33010602011771号