`

单链表的基本操作实现

J# 
阅读更多

#include #include using namespace std; typedef struct node { int data; struct node *next; }slink; void create(slink *&head) { head = new slink; head->next = NULL; } void getlen(slink *head, unsigned &len) { slink *p; p = head; while (p!= NULL) { ++len; p = p->next; } } void print(slink *head) { slink *p; p = head; while ( p != NULL) { cout << p->data << "\t"; p = p->next; } } /*slink* insert(slink *head, int data, int posi) //按位置插入 { slink* p = head; slink* insert; if (head == NULL) //当没有数据时,插入头链表 { insert = new slink; insert -> data = data; insert -> next = NULL; head = insert; return head; } else { for ( int a = 0; a < posi - 1; a++) { p = p -> next; } if (0 == posi) { insert = new slink; insert -> data = data; insert -> next = p; head = insert; return head; } else { insert = new slink; insert -> data = data; insert-> next = p -> next; p -> next = insert; return head; } } return head; }*/ slink* insert(slink *head, int data) //按从小到大顺序插入 { slink *p0, *p1, *p2; p1 = head; p0 = new slink; p0 -> data = data; while( p0->data > p1->data && p1->next != NULL) { p2 = p1; p1 = p1 -> next; } if (p0 -> data <= p1 ->data) { if (head == p1) { p0 -> next = p1; head = p0; } else { p0->next = p1; p2->next = p0; // p0 -> next = p2 -> next; //和上面两语句等效 // p2 -> next = p0; } } else { p1 -> next = p0; p0 -> next = NULL; } return head; } slink* search(slink *head, int sdata) { slink* p = NULL; while (head != NULL ) { if (head -> data == sdata) { p = head; return p; } else { head = head -> next; continue; } } return p; } slink* del(slink *head, int deldata) { slink *p = head; slink *del = NULL; while ( p != NULL ) { if ( p -> data == deldata ) { if ( p == head ) //当删除的结点为头结点时 { head = head -> next; delete p; //在堆中删除 return head; } else { del -> next = p -> next; delete p; return head; } } del = p; p = p -> next; } cout<<"删除失败,没有找到节点"< next == NULL) { return head; } p = head; for ( int j = 1; j < length; ++j) { p = head; for (int i = 0; i < length - j; ++i) { if (p->data < p->next->data) //从大到小排序 { temp = p->data; p->data = p->next->data; p->next->data = temp; } p = p->next; } } return head; } slink* reverse(slink* head) { /* slink *preNode,*curNode,*nextNode; if(head==NULL) return NULL;//空链表 if(head->next == NULL) return head;//仅一个元素 curNode = head;preNode=NULL;//初始化 while(curNode) { nextNode = curNode->next;//先记录下一个结点 curNode->next = preNode;//改变链表方向(逆置) preNode = curNode;//将当前结点作为下一次循环的前一个结点 curNode = nextNode;//向后推移一个结点 } return preNode;//当遍历完链表后curNode应该为空,此时preNode就是逆置后链表头(head) */ slink *p1, *p2, *p3; if ( head == NULL || head -> next == NULL) { return head; } p1 = head, p2 = p1 -> next; while (p2) { p3 = p2 -> next; p2 -> next = p1; p1 = p2; p2 = p3; } head -> next = NULL; head = p1; return head; } slink* searchmid(slink* head, slink *mid) { slink *temp = head; slink *p = head; while ( p->next != NULL && p->next->next != NULL ) //此处两个逻辑表达式顺序不能交换 { p = p->next->next; temp = temp->next; mid = temp; } return mid; } int main() { int choose; unsigned len = 0; int isExit = 1; slink *head = NULL; create(head); //创建链表 head -> data = 0; while(isExit) { cout << endl; cout << "****************************" << endl; cout << "* 1、 退出 *" << endl; cout << "* 2、 插入数据 *" << endl; cout << "* 3、 查询数据 *" << endl; cout << "* 4、 输出链表 *" << endl; cout << "* 5、 求链表长度 *" << endl; cout << "* 6、 删除链表 *" << endl; cout << "* 7、 排序 *" << endl; cout << "* 8、 链表逆置 *" << endl; cout << "* 9、 搜索链表中间结点 *" << endl; cout << "****************************" << endl; cout << "Please enter your choose(1、2、3、4、5、6、7、8): " << endl; cin >> choose; switch(choose) { case 1: { isExit = 0; slink *p; while (head != NULL) { p = head; head = head -> next; delete p; } cout << "bye!" << endl; } break; case 2: { /*int data; //按位置插入 int posi; cout << "输入要插入的数据:" << endl; cin >> data; cout << "输入插入位置: " << endl; cin >> posi; head = insert(head, data, posi); */ int data; //按大小插入 cout << "\n输入要插入的数据:" << endl; cin >> data; head = insert(head, data); break; } case 3: { slink* result; int sdata; cout << "\n输入查询数据:" << endl; cin >> sdata; result = search(head, sdata); if ( result != NULL ) { cout << "查询结果: " << result -> data << endl; } else { cout << "search false" << endl; } break; } case 4: { print(head); break; } case 5: { getlen(head, len); cout << "\n该链表长度:" << len << endl; break; } case 6: { cout << " \nbefore delete: "; print(head); slink *delhead; int deldata; cout<< "\n输入要删除节点的数据:" << endl; cin >> deldata; delhead = del(head, deldata); cout << "\nafter delete " << endl; print(delhead); break; } case 7: { print(head); sort(head); cout << endl; print(head); break; } case 8: { print(head); head = reverse(head); cout << endl; print(head); break; } case 9: { slink *middata = NULL; middata = searchmid(head, middata); print(head); cout << " \nmiddata: " << middata->data << endl; } default: break; } } return 0; }

分享到:
评论

相关推荐

    单链表数据结构,包括单链表定义与特点、单链表的C语言描述、单链表基本形态、单链表基本操作实现、单链表的运用

    单链表基本操作实现主要包含以下几个方面:创建链表、插入节点、删除节点、查找节点、访问节点、链表的清空及销毁等。创建链表通常从空链表开始,通过逐个添加节点进行构建。插入节点操作允许在链表中的任意位置加入...

    c++实现单链表基本操作

    以上就是带头结点单链表的基本操作实现。在实际编程中,还需要考虑异常处理和内存管理,例如在分配和释放节点时防止内存泄漏。此外,还可以扩展这些基础功能,例如实现查找、排序、合并等高级操作。在C++中,理解并...

    c++单链表基本操作的实现

    1、单链表基本操作的实现 [问题描述]要在带头结点的单链表h中第i个数据元素之前插入一个数据元素x ,首先需要在单链表中寻找到第i-1个结点并用指针p指示,然后申请一个由指针s 指示的结点空间,并置x为其数据域值,...

    单链表的基本操作及实现

    单链表是一种基础的数据结构,它在...总的来说,理解和掌握单链表的基本操作对于学习数据结构和算法至关重要,它是许多高级数据结构如双链表、哈希表等的基础。通过熟悉这些操作,能够为编写高效的程序打下坚实的基础。

    数据结构单链表的基本操作

    比较不错的一个实现单链表 基本操作 其中有初始化 输出 插入 删除 测长等一系列

    单链表的基本操作实现-查找_单链表的基本操作实现_

    本主题主要关注单链表的基本操作实现,特别是查找操作。以下是对单链表查找操作的详细阐述。 1. **单链表结构**: 单链表中的每个节点(Node)由两部分组成:数据域(Data),存储实际数据;指针域(Next),指向...

    单链表操作基本运算_单链表的基本操作_

    这个压缩包文件“单链表操作基本运算”包含了关于如何在编程中实现单链表基本操作的详细内容,特别是插入和删除操作。 单链表的插入操作通常分为头插法和尾插法。头插法是在链表的开头添加新节点,这需要更新头节点...

    数据结构中的单链表实现基本操作

    数据结构中的单链表实现基本操作,初始化,删除,添加十分准确

    python实现的单链表的基本操作和进阶操作

    1. Python实现单链表; 2. 确保可执行,并在文件中给出了案例与执行结果; 3. 单链表的操作:单链表构建,从头插入,从尾插入以及从指定位置插入与删除等操作; 4. .py文件展示了可执行的代码文件 5. 具体内容分析...

    单链表的基本操作的实现

    这是用C语言来写的单链表的实现。里面包含了许多有关单链表的操作……

    Java实现单链表的基本操作

    本文将深入探讨如何使用Java语言实现单链表的基本操作,包括创建链表、插入节点、删除节点以及遍历链表等关键功能。 首先,我们需要理解单链表的概念。单链表是一种线性数据结构,其中每个元素(称为节点)包含两个...

    实验报告1.3单链表的设计与实现

    #### 三、单链表基本操作实现 **1. 创建空链表** ```cpp LinkList createNullList_link(void) { LinkList llist = new struct Node; /* 申请表头结点空间 */ if (llist != NULL) llist-&gt;link = NULL; else cout...

    单链表的基本操作验证

    ### 数据结构实验:单链表的基本操作验证 #### 引言 计算机技术的核心之一在于如何高效地表示和处理信息,这一过程涉及数据的组织、存储和运算方式。数据结构与算法构成了程序设计的基石,正如N.Wirth教授所提出...

    数据结构试验 单链表的基本操作及应用

    在提供的源代码中,"试验一:单链表的基本操作及应用"可能包含了上述所有操作的实现。通过阅读和理解这段代码,你可以深入学习单链表的内部工作原理,提高编程技能。此外,实践这些操作可以帮助你更好地掌握数据结构...

    单链表的基本操作.c

    用C语言写的用于实现单链表的基本操作的源代码,都是经过测试可以运行的!定义单链表类型并动态创建单链表 1、实现线性表链式存储结构下元素的插入操作 3、实现线性表链式存储结构下元素的删除操作 4、实现线性...

    单链表的基本操作

    下面我们将详细讨论单链表的建立、查找、插入和删除等基本操作。 ### 一、单链表的建立 创建一个单链表首先需要定义节点结构。在C语言中,这通常通过以下方式完成: ```c typedef struct Node { int data; // ...

    单链表的实现-简单操作

    单链表的实现-简单操作

    带头结点单链表基本操作.doc

    ### 带头结点单链表的基本操作详解 #### 引言 单链表是数据结构中的一个重要概念,尤其在计算机科学...以上所述为带头结点单链表的基本操作实现,这些函数构成了链表操作的基础,为后续复杂功能的开发提供了有力支持。

Global site tag (gtag.js) - Google Analytics