C/C++ 单链表的创建、插入、删除、查找实现

建立一个单链表

struct List {
    
    
    int val;  //存值
    struct List* next;  //存下一个元素的地址
};
函数值的插入与主函数
/* 链表创建  */
void Init(struct List* L) {
    
     
    int cur;
    cin >> cur;    //存要插入的值
 
    while (cur != -1) {
    
        //当输入为-1时结束
        struct List* ptr = (struct List*)malloc(sizeof(struct List));    //申请空间
        ptr->val = cur;   
        ptr->next = NULL;  //指向下一个地址
 
        L->next = ptr;    //与链表链接
        L = L->next; //改变指针,指向下一个节点
        cin >> cur;   
    }
}
 
int main() {
    
    
    
    struct List* head = (struct List*)malloc(sizeof(struct List));  //头结点(不存值)
    head->next = NULL;  
    Init(head); //初始化链表
 
    return 0;
}

单链表遍历

/*  遍历链表  */
void Show(struct List* L) {
    
     
    cout << "链表遍历:" ;
    
    while (L->next) {
    
    
        cout << L->next->val << " "; 
        L = L->next;  
    }
    cout << endl;
}
 

插入数值

/*  在第K个位置前插入data元素,最后链表 的第K个位置就是data */
void InsertList (struct List* L, int k, int data) {
    
    
    
    struct List* pre = NULL; //存储第K-1个元素的值
    struct List* ptr = (struct List*)malloc(sizeof(struct List));   //申请空间
    ptr->val = data;
    ptr->next = NULL;
    
    while (k && L->next) {
    
      //查找到放置data元素的位置
        pre = L;
        L = L->next;
        k --;
    }
    
    if (k > 0) {
    
        //如果K > 0 直接插到链表的表尾
        L->next = ptr;
        L = L->next;
    }else {
    
    
        pre->next = ptr;    //链接链表
        ptr->next = L;
    }
}
 
int main() {
    
    
    struct List* head = (struct List*)malloc(sizeof(struct List));  //头结点(不存值)
    head->next = NULL;  
    Init(head); //初始化链表
    
    Show(head);
    int i, data;
    cout << "请输入要插入的位置和值:";
    cin >> i;
    cin >> data;
    
    InsertList(head, i, data);  //在第i个位置前插入data
    
    Show(head);
    return 0;
}

删除

int lengthList (struct List* L) {
    
       //求链表长度
    int len = 0;
    while (L->next) {
    
     
        len ++;
        L = L->next;
    }
    return len;
}

void DeleteList_Position(struct List* L, int k) {
    
       //删除第K个位置的结点
    if (lengthList(L) <= 0) {
    
    
        cout << "表空,没有元素可删除" << endl;
        return;
    }
 
    struct List* ptr = L->next;
    struct List* pre = L;   //记录ptr的前一个位置的结点
    k = k - 1;  //因为如果k = 1,直接用pre->next = ptr->next就把ptr删掉了,所以要减1
    while (k-- && ptr) {
    
    
        pre = ptr;
        ptr = ptr->next;
    } 
    if (ptr == NULL || k > 0) {
    
    
        cout << "要删除的位置不存在" << endl;
    }else {
    
    
        pre->next = ptr->next;  //删除ptr结点
        free(ptr);  //释放空间
    }
}
void DeleteList (struct List* L, int x) {
    
       //删除值为x的结点(链表无重复值)
    if (lengthList(L) <= 0) {
    
    
        cout << "表空,没有元素可删除" << endl;
        return;
    }
 
    struct List* ptr = L->next;
    struct List* pre = L;   //记录ptr的前一个位置的结点
    while (ptr) {
    
    
        if (ptr->val == x) {
    
    
            pre->next = ptr->next;  //把x值的结点的前一个结点的next指向ptr的next结点
            free(ptr);  //释放空间
            return;
        }
        pre = ptr;
        ptr = pre->next;
    }
}

猜你喜欢

转载自blog.csdn.net/wuyvle/article/details/113431899