链表的基本操作

#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;
}

 

posted @ 2021-04-17 18:34  银发制御  阅读(132)  评论(0)    收藏  举报