#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++中,理解并...
1、单链表基本操作的实现 [问题描述]要在带头结点的单链表h中第i个数据元素之前插入一个数据元素x ,首先需要在单链表中寻找到第i-1个结点并用指针p指示,然后申请一个由指针s 指示的结点空间,并置x为其数据域值,...
单链表是一种基础的数据结构,它在...总的来说,理解和掌握单链表的基本操作对于学习数据结构和算法至关重要,它是许多高级数据结构如双链表、哈希表等的基础。通过熟悉这些操作,能够为编写高效的程序打下坚实的基础。
比较不错的一个实现单链表 基本操作 其中有初始化 输出 插入 删除 测长等一系列
本主题主要关注单链表的基本操作实现,特别是查找操作。以下是对单链表查找操作的详细阐述。 1. **单链表结构**: 单链表中的每个节点(Node)由两部分组成:数据域(Data),存储实际数据;指针域(Next),指向...
这个压缩包文件“单链表操作基本运算”包含了关于如何在编程中实现单链表基本操作的详细内容,特别是插入和删除操作。 单链表的插入操作通常分为头插法和尾插法。头插法是在链表的开头添加新节点,这需要更新头节点...
数据结构中的单链表实现基本操作,初始化,删除,添加十分准确
1. Python实现单链表; 2. 确保可执行,并在文件中给出了案例与执行结果; 3. 单链表的操作:单链表构建,从头插入,从尾插入以及从指定位置插入与删除等操作; 4. .py文件展示了可执行的代码文件 5. 具体内容分析...
这是用C语言来写的单链表的实现。里面包含了许多有关单链表的操作……
本文将深入探讨如何使用Java语言实现单链表的基本操作,包括创建链表、插入节点、删除节点以及遍历链表等关键功能。 首先,我们需要理解单链表的概念。单链表是一种线性数据结构,其中每个元素(称为节点)包含两个...
#### 三、单链表基本操作实现 **1. 创建空链表** ```cpp LinkList createNullList_link(void) { LinkList llist = new struct Node; /* 申请表头结点空间 */ if (llist != NULL) llist->link = NULL; else cout...
### 数据结构实验:单链表的基本操作验证 #### 引言 计算机技术的核心之一在于如何高效地表示和处理信息,这一过程涉及数据的组织、存储和运算方式。数据结构与算法构成了程序设计的基石,正如N.Wirth教授所提出...
在提供的源代码中,"试验一:单链表的基本操作及应用"可能包含了上述所有操作的实现。通过阅读和理解这段代码,你可以深入学习单链表的内部工作原理,提高编程技能。此外,实践这些操作可以帮助你更好地掌握数据结构...
用C语言写的用于实现单链表的基本操作的源代码,都是经过测试可以运行的!定义单链表类型并动态创建单链表 1、实现线性表链式存储结构下元素的插入操作 3、实现线性表链式存储结构下元素的删除操作 4、实现线性...
下面我们将详细讨论单链表的建立、查找、插入和删除等基本操作。 ### 一、单链表的建立 创建一个单链表首先需要定义节点结构。在C语言中,这通常通过以下方式完成: ```c typedef struct Node { int data; // ...
单链表的实现-简单操作
### 带头结点单链表的基本操作详解 #### 引言 单链表是数据结构中的一个重要概念,尤其在计算机科学...以上所述为带头结点单链表的基本操作实现,这些函数构成了链表操作的基础,为后续复杂功能的开发提供了有力支持。