链表的实现

编程技术  /  houtizong 发布于 3年前   48
#include <iostream>#include <stdlib.h>using namespace std;typedef struct lNode {    lNode *lNext;    int data;} lNode , *LinkedList;//函数声明LinkedList initNode();void showNodes(LinkedList head);int getLength(LinkedList);int main(){    //初始化头结点    LinkedList lHead = initNode();    int arr[100];    int length;    cout << "输入您要建立链表的长度:" << endl;    cin >> length;    cout << "输入您建立链表的各个结点值:" << endl;    for(int i = 0; i < length ; i++) {        cin >> arr[i];    }    //测试尾插法初始化链表    //void initLinkedListAtLast(LinkedList , int , int[]);    //initLinkedListAtLast(lHead , length , arr);    //测试头插法初始化链表    void initLinkedListAtHead(LinkedList , int , int[]);    initLinkedListAtHead(lHead , length , arr);    //插入测试    /*void insertNode(LinkedList head , LinkedList node , int index);    int iInsertIndex;    int iInsertValue;    cout << "插入前链表中所有元素的值为:" << endl;    showNodes(lHead);    cout << "请输入您要插入的元素值 :" << endl;    cin >> iInsertValue;    LinkedList lInsert = initNode();    lInsert->data = iInsertValue;    lInsert->lNext = NULL;    cout << "请输入您要插入元素的位置,不小于 1,不大于" << getLength(lHead) + 1 << ":" << endl;    cin >> iInsertIndex;    insertNode(lHead , lInsert , iInsertIndex);    cout << "插入后链表里面的元素值为:" << endl;    showNodes(lHead);*/    //测试删除    /*void deleteNode(LinkedList , int);    int iDeleteIndex;    cout << "删除前链表中所有元素的值为:" << endl;    showNodes(lHead);    cout << "请输入要删除元素的地址值,不小于 1,不大于 " << getLength(lHead) << ":" << endl;    cin >> iDeleteIndex;    deleteNode(lHead , iDeleteIndex);    cout << "删除后链表里面的元素值为 :" << endl;    showNodes(lHead);*/    //测试查找    /*LinkedList getNode(LinkedList , int);    int iSearchIndex;    cout << "当前链表中所有元素结点的值为:" << endl;    showNodes(lHead);    cout << "请输入您要查找元素的地址值,不小于 1,不大于 " << getLength(lHead) << ":" << endl;    cin >> iSearchIndex;    LinkedList lResult = getNode(lHead , iSearchIndex);    if(lResult != NULL) {        cout << "所查找到的元素值为:" << lResult->data << endl;    }*/    //测试修改    /*void changeNodeValue(LinkedList , int , int);    int iChangeIndex, iChangeValue;    cout << "修改前链表中所有元素结点的值:" << endl;    showNodes(lHead);    cout << "请输入您要修改结点的值:" << endl;    cin >> iChangeValue;    cout << "请输入您要修改结点的地址值:" << endl;    cin >> iChangeIndex;    changeNodeValue(lHead , iChangeIndex , iChangeValue);    cout << "修改后链表里面的元素值为:" << endl;    showNodes(lHead);*/    //测试链表的合并    /*LinkedList mergeLinkedList(LinkedList , LinkedList);    cout << "第一个链表的所有元素值为:" << endl;    showNodes(lHead);    LinkedList mergeList = initNode();    LinkedList lSecond = initNode();    initLinkedListAtHead(lSecond , 20);    cout << "第二个链表的所有元素值为:" << endl;    showNodes(lSecond);    mergeList = mergeLinkedList(lHead , lSecond);    cout << "合并后的链表的所有元素值为:" << endl;    showNodes(mergeList);*/    //测试链表的逆转    void reverseLinkedList(LinkedList , LinkedList);    cout << "逆转前的链表的所有元素值为:" << endl;    showNodes(lHead);    //LinkedList lResult2 = initNode();    //reverseLinkedList(lHead , lResult2);    void reverseList(LinkedList);    reverseList(lHead);    cout << "逆转后的链表的所有元素值为:" << endl;    //showNodes(lResult2);    showNodes(lHead);    //cout << "链表的长度为:" << getLength(lHead) << endl;    return 0;}//初始化结点LinkedList initNode() {    //初始化结点,分配适当的内存空间    LinkedList node = (LinkedList)(malloc(sizeof(lNode)));    return node;}//初始化链表(尾插法)void initLinkedListAtList(LinkedList lHead , int lSize , int arr[]) {    LinkedList curr = lHead;    LinkedList initNode();    //初始化长度为iSize的链表,取值以步长为1递增    for(int i = 0; i < lSize ; i ++) {        LinkedList lInsert = initNode();        lInsert->data = arr[i];        lInsert->lNext = NULL;        curr->lNext = lInsert;        curr = curr->lNext;    }}//初始化链表(头插法)void initLinkedListAtHead(LinkedList lHead , int iSize , int arr[]) {    LinkedList curr = lHead;    curr->lNext = NULL;    //声明生成结点的函数    LinkedList initNode();    //在当前指针    for(int i = 0; i < iSize; i++) {        LinkedList lInsert = initNode();        lInsert->data = arr[i];        lInsert->lNext = curr->lNext;        curr->lNext = lInsert;    }}//获得链表的长度int getLength(LinkedList lHead) {    LinkedList curr = lHead;    int length = 0;    while(curr->lNext != NULL) {        length++;        curr = curr->lNext;    }    return length;}//展示所有结点void showNodes(LinkedList head) {    while(head->lNext != NULL) {        head = head->lNext;        cout << head->data << " ";    }    if(head->lNext == NULL)        cout << endl;}//插入结点void insertNode(LinkedList head , LinkedList node , int index) {    //判断脚标是否越过下界    if(index <= 0) {        cout << "插入失败!您要插入的位置不存在!" << endl;        return;    }    //移动指针到插入脚标的前一个结点    LinkedList curr = head;    for(int i = 0; i < index - 1; i++) {        if(curr->lNext != NULL) {            curr = curr->lNext;        } else {            cout << "插入失败!您要插入的位置不存在!" << endl;            return;        }    }    //插入结点    node->lNext = curr->lNext;    curr->lNext = node;}//删除结点void deleteNode(LinkedList head , int index) {    //判断脚标是否越过下界    if(index <= 0) {        cout << "删除失败!您要删除的结点不存在!" << endl;        return;    }    //移动结点到要删除元素的前一位    LinkedList curr = head;    for(int i = 0; i < index - 1; i ++) {        if(curr->lNext != NULL) {            curr = curr->lNext;        } else {            cout << "删除失败!您要删除的结点不存在!" << endl;            return;        }    }    if(curr->lNext == NULL) {        cout << "删除失败!您要删除的结点不存在!" << endl;        return;    }    //删除元素并释放空间    LinkedList dNode = curr->lNext;    curr->lNext = dNode->lNext;    free(dNode);}//查找元素LinkedList getNode(LinkedList head , int index) {     //判断脚标是否越过下界    if(index <= 0) {        cout << "您要查找的结点不存在!" << endl;        return NULL;    }    LinkedList curr = head;    for(int i = 0; i < index ; i++) {        if(curr->lNext != NULL) {            curr = curr->lNext;        } else {            cout << "您要查找的结点不存在!" << endl;            return NULL;        }    }    return curr;}//修改结点值void changeNodeValue(LinkedList head , int index , int value) {     //判断脚标是否越过下界    if(index <= 0) {        cout << "您要修改的结点不存在!" << endl;        return;    }    //移到指针到要修改的结点处    LinkedList curr = head;    for(int i = 0; i < index ; i++) {        if(curr->lNext != NULL) {            curr = curr->lNext;        } else {            cout << "您要修改的结点不存在!" << endl;            return;        }    }    //修改结点值    curr->data = value;}//合并两个有序链表LinkedList mergeLinkedList(LinkedList la , LinkedList lb) {    LinkedList laCurr = la->lNext;    LinkedList lbCurr = lb->lNext;    LinkedList lcCurr = la;    //LinkedList lc = lcCurr;  //课本上设置的这个变量完全是多余的,可以去掉    while(laCurr != NULL && lbCurr != NULL) {        if(laCurr->data >= lbCurr->data){            lcCurr->lNext = lbCurr;            lcCurr = lcCurr->lNext;            lbCurr = lbCurr->lNext;        } else {            lcCurr->lNext = laCurr;            lcCurr = lcCurr->lNext;            laCurr = laCurr->lNext;        }    }    lcCurr->lNext = laCurr ? laCurr : lbCurr;    free(lb);    //return lc;    return la;}//逆转链表void reverseLinkedList(LinkedList lHead , LinkedList iResult) {    //如果传入的只是个头指针,则退出运算    if(lHead->lNext == NULL) {        free(lHead);        return;    }    //找到倒数第二个元素结点    LinkedList tail = lHead;    //int length = 0;    while(tail->lNext->lNext != NULL) {        tail = tail->lNext;        //length ++;    }    //让返回的LinkedList指针,指向传入LinkedList的最后一个元素结点    iResult->lNext = tail->lNext;    //把倒数第二个结点设成倒数第一个结点    tail->lNext = NULL;    //递归调用函数    reverseLinkedList(lHead , iResult->lNext);    //cout << tail->data << "  " << length << endl;}//头插法进行逆转void reverseList(LinkedList lHead) {    LinkedList list1 , list2;    //记录第二个结点    list1 = list2 = lHead->lNext->lNext;    lHead->lNext->lNext = NULL;    //将第二个结点及以后的所有结点依次插入头结点之后    while(list1 != NULL) {        list2 = list2->lNext;        list1->lNext = lHead->lNext;        lHead->lNext = list1;        list1 = list2;    }}
上一篇:顺序表的实现
下一篇:双向链表的实现

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客