单链表的实现
数据结构与算法——单链表的实现及原理
数据结构与算法——单链表的实现及原理1. 单链表的原理 链表是线性表的链式存储⽅式,逻辑上相邻的数据在计算机内的存储位置不必须相邻,那么怎么表⽰逻辑上的相邻关系呢?可以给每个元素附加⼀个指针域,指向下⼀个元素的存储位置。
如图所⽰: 从图中可以看出,每个结点包含两个域:数据域和指针域,指针域存储下⼀个结点的地址,因此指针指向的类型也是结点类型链表的核⼼要素:Ø 每个节点由数据域和指针域组成 Ø 指针域指向下⼀个节点的内存地址。
1.1 结构体定义1 Typedef struct LinkNode2 {3 ElemType data; //节点中存放数据的类型4struct LinkNode* next; //节点中存放下⼀节点的指针5 }LinkList, LinkNode;2. 单链表初始化链表的节点均单向指向下⼀个节点,形成⼀条单向访问的数据链1//单链表的初始化2 typedef struct _LinkNode3 {4int data; //结点的数据域5struct _LinkNode* next; //结点的指针域6 }LinkNode, LinkList; //链表节点、链表78bool InitList(LinkList*& L) //构造⼀个空的单链表 L9 {10 L = new LinkNode; //⽣成新结点作为头结点,⽤头指针 L 指向头结点11if(!L)return false; //⽣成结点失败12 L->next=NULL; //头结点的指针域置空13return true;14 }3. 单链表增加元素 - 单链表前插法插⼊节点的要素就是要找到要插⼊位置的前⼀个节点,将这个节点的Next赋值给新节点,然后将新节点的地址赋值给前⼀个节点的Next便可,任意位置插⼊和前插法均是如此。
1//前插法2bool ListInsert_front(LinkList * &L, LinkNode * node) //参数1 链表指针参数2 要插⼊的节点元素3 {4if (!L || !node) return false; //如果列表或节点为空返回 false5 node->next = L->next; //将头节点指向节点1的地址赋值给要插⼊节点的指针域,使要插⼊的节点先与后部相连6 L->next = node; //将插⼊节点的地址赋值给头结点的指针域,使要插⼊节点与头结点相连78return true;9 }4. 单链表增加元素 - 单链表尾插法1//尾插法2bool ListInsert_back(LinkList*& L, LinkNode* node)3 {4 LinkNode* last = NULL; //创建空指针,5if (!L || !node) return false; //如果列表或节点为空返回 false67 last = L;8while (last->next) last = last->next; //使⽤ last 找到最后⼀个节点910 node->next = NULL; //要插⼊节点由于在尾部,指针域置为 NULL11 last->next = node; //将要插⼊节点的地址赋值给之前的尾部节点的指针域,将要插⼊节点放置到尾部12return true;13 }5. 单链表增加元素 - 单链表任意位置插⼊插⼊节点的要素就是要找到要插⼊位置的前⼀个节点,将这个节点的Next赋值给新节点,然后将新节点的地址赋值给前⼀个节点的Next便可,任意位置插⼊和前插法均是如此。
实现单链表的各种基本运算
实现单链表的各种基本运算一、实验目的了解单链表表的结构特点及有关概念,掌握单链表的各种基本操作算法思想及其实现。
二、实验内容编写一个程序,实现顺序表的各种基本运算:1、初始化单链表;2、单链表的插入;3、单链表的输出;4、求单链表的长度5、判断单链表是否为空;6、输出单链表的第i位置的元素;7、在单链表中查找一个给定元素在表中的位置;8、单链表的删除; 9、释放单链表三、算法思想与算法描述简图四、实验步骤与算法实现#include<stdio.h>#include<malloc.h>typedef char ElemType;typedef struct LNode//定义单链表{ ElemType data;struct LNode *next;}LinkList;void InitList(LinkList*&L){ L=(LinkList*)malloc(sizeof(LinkList));//创建头结点L->next=NULL;//头结点赋值为空}void DestroyList(LinkList*&L)//销毁单链表(释放单链表L占用的内存空间即逐一释放全部结点的空间){ LinkList*p=L,*q=p->next;while(q!=NULL){free(p);p=q;q=p->next;}free(p);}int ListEmpty(LinkList*L)//判线性表是否为空表ListEmpty(L){ return(L->next==NULL);}//若单链表L没有数据结点,则返回真,否则返回假。
int ListLength(LinkList*L)//求线性表的长度ListLength(L){ LinkList*p=L;int i=0;while(p->next!=NULL){i++;p=p->next;}return(i);//返回单链表L中数据结点的个数}void DispList(LinkList*L)//输出线性表DispList(L){LinkList*p=L->next;while (p!=NULL)//逐一扫描单链表L的每个数据结点,并显示各结点的data域值。
单链表的实验报告总结
单链表的实验报告总结单链表是一种常用的数据结构,它由一系列节点组成,每个节点包含了数据和指向下一个节点的指针。
在实验中,我们对单链表进行了操作和实现,通过此次实验,我深刻理解了单链表的特点和应用。
以下是我对此次实验的总结和体会。
在实验中我们实现了单链表的创建和初始化。
通过创建一个头节点,并将头节点的指针指向空,我们成功地初始化了一个空的单链表。
这为后续的操作打下了基础。
接着,我们实现了单链表的插入操作。
通过指定要插入的位置和值,我们可以在单链表的任意位置插入一个新的节点。
这个操作非常灵活,让我感受到了单链表的动态性和可变性。
通过插入操作,我们可以在单链表中任意位置插入新的元素,从而灵活地调整单链表的结构和内容。
在实验中,我们还实现了单链表的删除操作。
通过指定要删除的节点位置,我们可以将该节点从单链表中删除。
这个操作也非常重要,可以帮助我们对单链表中的数据进行动态管理。
通过删除操作,我们可以方便地删除单链表中的某个元素,从而保持单链表的整洁和有序。
除了插入和删除操作,我们还实现了单链表的查找操作。
通过指定要查找的值,我们可以在单链表中查找到对应的节点。
这个操作非常实用,可以帮助我们快速定位和访问单链表中的数据。
通过查找操作,我们可以方便地获取单链表中特定元素的值,从而满足我们对数据的需求。
在实验中,我们还实现了单链表的修改操作。
通过指定要修改的节点位置和新的值,我们可以将单链表中某个节点的值进行修改。
这个操作也非常有用,可以帮助我们对单链表中的数据进行更新和改进。
通过修改操作,我们可以方便地对单链表中的某个元素进行数值的调整,从而满足我们对数据的要求。
通过本次实验,我对单链表的原理和操作有了更深入的理解。
单链表是一种非常灵活和实用的数据结构,可以应用于各种场景和问题。
它的特点是插入和删除操作的效率很高,但查找和修改操作的效率较低。
因此,在实际应用中,我们需要根据具体的需求和场景选择合适的数据结构。
数据结构-单链表基本操作实现(含全部代码)
数据结构-单链表基本操作实现(含全部代码)今天是单链表的实现,主要实现函数如下:InitList(LinkList &L) 参数:单链表L 功能:初始化时间复杂度 O(1)ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度时间复杂度O(n)ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插时间复杂度O(n)[加⼊了查找]若已知指针p指向的后插 O(1)ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素时间复杂度O(n)[加⼊了查找]若已知p指针指向的删除最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。
最坏是O(n),即从头查找p之前的结点,然后删除p所指结点LocateElem(LinkList L,ElemType e) 参数:单链表L,元素e 功能:查找第⼀个等于e的元素,返回指针时间复杂度O(n)代码:/*Project: single linkeed list (数据结构单链表)Date: 2018/09/14Author: Frank YuInitList(LinkList &L) 参数:单链表L 功能:初始化时间复杂度 O(1)ListLength(LinkList L) 参数:单链表L 功能:获得单链表长度时间复杂度O(n)ListInsert(LinkList &L,int i,ElemType e) 参数:单链表L,位置i,元素e 功能:位置i后插时间复杂度O(n)[加⼊了查找]若已知指针p指向的后插 O(1)ListDelete(LinkList &L,int i) 参数:单链表L,位置i 功能:删除位置i元素时间复杂度O(n)[加⼊了查找]若已知p指针指向的删除最好是O(1),因为可以与后继结点交换数据域,然后删除后继结点。
c语言单链表头插法实现链表逆置
c语言单链表头插法实现链表逆置链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
在C语言中,我们可以使用单链表来实现各种操作,如插入、删除和查找等。
本文将介绍如何使用头插法实现链表的逆置。
首先,我们需要定义一个链表节点的结构体,包含数据和指向下一个节点的指针。
代码如下:```ctypedef struct Node {int data;struct Node* next;} Node;```接下来,我们需要实现链表的创建和逆置函数。
首先,创建一个空链表,并将头节点指针指向NULL。
代码如下:```cNode* createList() {Node* head = NULL;return head;}```然后,我们可以实现链表的插入函数,使用头插法将新节点插入到链表的头部。
代码如下:```cNode* insertNode(Node* head, int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head;head = newNode;return head;}```接下来,我们可以实现链表的逆置函数,通过遍历链表,将每个节点插入到头部,从而实现链表的逆置。
代码如下:```cNode* reverseList(Node* head) {Node* newHead = NULL;Node* temp = NULL;while (head != NULL) {temp = head->next;head->next = newHead;newHead = head;head = temp;}return newHead;}```最后,我们可以编写主函数,测试链表的逆置功能。
代码如下:```cint main() {Node* head = createList();head = insertNode(head, 1);head = insertNode(head, 2);head = insertNode(head, 3);head = insertNode(head, 4);head = insertNode(head, 5);printf("原链表:");Node* temp = head;while (temp != NULL) {printf("%d ", temp->data);temp = temp->next;}printf("\n");head = reverseList(head);printf("逆置后的链表:");temp = head;while (temp != NULL) {printf("%d ", temp->data);temp = temp->next;}printf("\n");return 0;}```运行以上代码,输出结果如下:```原链表:5 4 3 2 1逆置后的链表:1 2 3 4 5```通过以上代码,我们成功地使用C语言的单链表头插法实现了链表的逆置。
单链表基本操作的实现
单链表基本操作的实现单链表是一种常见的数据结构,它由多个节点组合而成,每个节点包含一个数据元素和一个指向下一个节点的指针。
通过指针,我们可以方便地在单链表中进行插入、删除和遍历等操作。
以下是关于单链表基本操作的实现。
1. 单链表的创建单链表的创建需要定义一个空的头结点,它的作用是方便在链表的头部进行添加和删除节点操作。
一个空的头节点可以在链表初始化的过程中进行创建。
```typedef struct Node{int data;struct Node *next;}Node;Node *createList(){Node *head = (Node*)malloc(sizeof(Node)); //创建空的头节点head->next = NULL;return head; //返回头节点的地址}```2. 单链表的插入单链表的插入可以分为在链表头部插入、在链表尾部插入和在链表中间插入三种情况。
a. 在链表头部插入节点:```void insertAtHead(Node *head, int data){Node *node = (Node*)malloc(sizeof(Node));node->data = data;node->next = head->next;head->next = node;}```b. 在链表尾部插入节点:```void insertAtTail(Node *head, int data){Node *node = (Node*)malloc(sizeof(Node));node->data = data;node->next = NULL;Node *p = head;while(p->next != NULL){p = p->next;}p->next = node;}```c. 在链表中间插入节点:```void insertAtMid(Node *head, int data, int pos){ Node *node = (Node*)malloc(sizeof(Node)); node->data = data;node->next = NULL;Node *p = head;int count = 0;while(p->next != NULL && count < pos-1){ p = p->next;count++;}if(count == pos-1){node->next = p->next;p->next = node;}else{printf("插入位置错误!");}}```3. 单链表的删除单链表的删除可以分为在链表头部删除、在链表尾部删除和在链表中间删除三种情况。
单链表求集合的并、交和差运算
单链表求集合的并、交和差运算单链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
在计算机科学中,我们经常需要对集合进行操作,包括求并集、交集和差集。
在本文中,我们将介绍如何使用单链表来实现这些集合操作。
我们需要定义一个单链表的数据结构。
每个节点包含一个数据元素和一个指向下一个节点的指针。
我们可以使用类来实现这个数据结构,例如:```class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = None```接下来,我们需要实现集合的并、交和差运算。
首先是并运算,它将两个集合中的所有元素合并为一个新的集合。
我们可以使用两个指针分别遍历两个链表,将两个链表中的元素逐个比较,并将不重复的元素添加到结果链表中。
具体代码如下:```def union(l1, l2):result = LinkedList()p1 = l1.headp2 = l2.headwhile p1 is not None:result.append(p1.data)p1 = p1.nextwhile p2 is not None:if not result.contains(p2.data):result.append(p2.data)p2 = p2.nextreturn result```接下来是交运算,它将两个集合中共有的元素提取出来组成一个新的集合。
同样地,我们可以使用两个指针分别遍历两个链表,将相同的元素添加到结果链表中。
具体代码如下:```def intersection(l1, l2):result = LinkedList()p1 = l1.headwhile p1 is not None:if l2.contains(p1.data):result.append(p1.data)p1 = p1.nextreturn result```最后是差运算,它将第一个集合中不属于第二个集合的元素提取出来组成一个新的集合。
数据结构课件单链表
删除链表中的节点需要遍历至指定位置,时间复杂度为 O(n)。
查找节点
在链表中查找一个节点需要遍历整个链表,时间复杂度为 O(n)。
空间复杂度
空间占用
单链表的空间占用主要取决于链表中的 节点数,因此空间复杂度为O(n)。
VS
内存分配
每个节点需要分配内存空间存储数据和指 针,因此内存分配的空间复杂度也为O(n) 。
需要根据数据元素顺 序进行遍历的场景, 如排序算法等。
需要频繁插入、删除 操作的场景,如动态 规划、图算法等。
02
单链表的实现
创建单链表
定义节点结构体
首先需要定义一个节点结构体,包含 数据域和指针域两个部分,数据域用 于存储数据,指针域用于指向下一个 节点。
初始化头节点
创建一个头节点,并将其指针域指向 NULL,表示单链表的起始位置。
05
单链表常见问题与解决方 案
循环链表
总结词
循环链表是一种特殊类型的单链表,其中尾节点的指针指向头节点,形成一个闭环。
详细描述
在循环链表中,由于尾节点的指针指向头节点,因此遍历链表时需要特别注意,以避免无限循环。常见的解决方 法是在遍历时记录已经访问过的节点,避免重复访问。
链表中的重复元素
总结词
链表中可能存在重复元素的问题,这会影响数据处理的正确性。
详细描述
为了解决这个问题,可以在插入节点时检查新元素是否已存在于链表中。如果存在,则不进行插入操 作。另外,也可以使用哈希表等数据结构来快速查找重复元素。
链表的排序
总结词
对链表进行排序是常见的需求,但链表的排 序算法通常比数组的排序算法复杂。
合并单链表
总结词
将两个已排序的单链表合并为一个新的已排序的单链表。
编写算法:实现带头结点单链表的逆置算法
编写算法:实现带头结点单链表的逆置算法引言单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含两部分:数据域和指针域。
其中,数据域用于存储数据,指针域用于指向下一个节点。
在单链表中,头结点是第一个节点之前的一个特殊节点,它不存储任何数据。
逆置(或反转)单链表是将原始链表中的节点顺序颠倒过来。
例如,给定一个单链表:1 -> 2 -> 3 -> 4 -> nullptr,逆置后的结果为:4 -> 3 -> 2 -> 1 -> nullptr。
本文将介绍如何实现带头结点单链表的逆置算法,并给出相应的C++代码实现。
算法思路要实现带头结点单链表的逆置算法,可以使用迭代或递归两种方法。
迭代方法迭代方法通过遍历原始链表中的每个节点,并修改其指针域来实现逆置。
具体步骤如下:1.如果链表为空或只有一个节点,则直接返回。
2.定义三个指针:prev、curr和next。
–prev指向当前节点的前一个节点(初始时为nullptr);–curr指向当前节点;–next指向当前节点的下一个节点。
3.进行循环,直到curr指向nullptr为止:–将curr的指针域修改为prev;–将prev指向curr;–将curr指向next;–将next指向下一个节点。
4.修改头结点的指针域为nullptr,将prev作为新的头结点。
递归方法递归方法通过逐层调用函数来实现逆置。
具体步骤如下:1.如果链表为空或只有一个节点,则直接返回。
2.定义一个递归函数reverseList,该函数接收一个参数:当前节点head。
3.递归终止条件:如果当前节点或当前节点的下一个节点为空,则返回当前节点。
4.在递归调用前,先逆置从下一个节点开始的子链表,并将返回结果保存在变量newHead中。
5.将当前节点的下一个节点的指针域修改为当前节点(即将子链表的尾部连接到当前节点)。
6.将当前节点的指针域修改为空(即将当前节点作为新链表的尾部)。
实验二:单链表基本运算实现
{
int data; //存放表结点值
struct node *next; //存放表结点的直接后驱元素的地址
} ListNode,*LinkList;
//头插法创建初始链表
LinkList create_h(int size)
{
;//将工作指针p指向后一个结点
;//计数器累加
}
return i;
}
//打印链表中的现有元素
printList(LinkList head)
{
LinkList p;
;//将工作指针p指向第1个结点
{
p=(LinkList)malloc(sizeof(ListNode));//申请新结点的存储空间
scanf("%d",&p->data);//读入新结点的值到data域中
;//将新增结点插到头结点的后面
;//将新增结点插到头结点的后面
printf("————头插法建立链表(1)\n");
printf("————尾插法建立链表(2)\n");
printf("————按位查找元素(3)\n");
printf("————按值查找元素(4)\n");
printf("————插入元素(5)\n");
printf("————删除元素(6)\n");
printList(h);
break;
case 5:
printf("插入元素,请输入要插入元素的值:\n");
数据结构实验报告单链表
数据结构实验报告_单链表数据结构实验报告——单链表一、实验目的1.掌握单链表的基本概念和原理。
2.了解单链表在计算机科学中的应用。
3.掌握单链表的基本操作,如插入、删除、遍历等。
4.通过实验,加深对理论知识的理解,提高编程能力。
二、实验内容1.实验原理:单链表是一种线性数据结构,由一系列节点组成,每个节点包含数据域和指针域。
其中,指针域指向下一个节点,最后一个节点的指针域指向空。
单链表的主要操作包括插入、删除、遍历等。
2.实验步骤:(1)创建一个单链表。
(2)实现插入操作,即在链表的末尾插入一个新节点。
(3)实现删除操作,即删除链表中的一个指定节点。
(4)实现遍历操作,即输出链表中所有节点的数据。
3.实验代码:下面是使用Python语言实现的单链表及其基本操作的示例代码。
class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = Nonedef insert(self, data):new_node = Node(data)if self.head is None:self.head = new_nodeelse:current = self.headwhile current.next is not None:current = current.nextcurrent.next = new_nodedef delete(self, data):if self.head is None:returnif self.head.data == data:self.head = self.head.nextreturncurrent = self.headwhile current.next is not None and current.next.data != data:current = current.nextif current.next is None:returncurrent.next = current.next.nextdef traverse(self):current = self.headwhile current is not None:print(current.data)current = current.next4.实验结果:通过运行上述代码,我们可以看到单链表的基本操作得到了实现。
实现单链表逆置的算法
实现单链表逆置的算法一、引言单链表是一种常见的数据结构,它由多个节点组成,每个节点包含一个数据元素和指向下一个节点的指针。
单链表的逆置是指将链表中的节点顺序进行颠倒,即原本指向下一个节点的指针指向上一个节点,从而实现链表的反向排列。
本文将介绍一种常用的单链表逆置算法,并详细解析其实现过程和原理。
二、算法实现单链表逆置算法的实现可以通过修改节点指针的方式完成。
具体步骤如下:1. 定义三个指针:prev指向当前节点的前一个节点,cur指向当前节点,next指向当前节点的下一个节点。
2. 遍历单链表,将当前节点的指针指向前一个节点,然后更新三个指针的位置,继续遍历下一个节点。
3. 当遍历到最后一个节点时,将其指针指向前一个节点,表示逆置完成。
4. 返回逆置后的头节点。
下面是算法的具体实现代码:```pythonclass ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef reverseList(head):prev = Nonecur = headwhile cur:next = cur.nextcur.next = prevprev = curcur = nextreturn prev```三、算法原理解析单链表逆置算法的核心思想是通过修改节点指针的方式实现链表的反向排列。
具体原理如下:1. 初始时,prev为None,cur指向头节点。
2. 在遍历过程中,先将当前节点的下一个节点保存到next指针中,以免断链。
3. 然后将当前节点的指针指向前一个节点,即将cur.next指向prev。
4. 更新prev为当前节点,cur为下一个节点,继续遍历下一个节点。
5. 当遍历到最后一个节点时,将其指针指向前一个节点,表示逆置完成。
6. 最后返回逆置后的头节点。
通过以上步骤,我们可以实现单链表的逆置。
c语言单链表程序代码
c语言单链表程序代码C语言单链表程序代码单链表是一种常见的数据结构,它由多个节点组成,每个节点包含一个数据域和一个指向下一个节点的指针。
以下是C语言实现单链表的程序代码:1. 定义节点结构体首先需要定义一个节点结构体,用来存储每个节点的数据和指针信息。
```typedef struct node {int data; // 数据域struct node *next; // 指向下一个节点的指针} Node;```2. 创建链表头节点创建一个头节点,它不存储任何数据,只是作为链表的起始点。
```Node *head = NULL;head = (Node*)malloc(sizeof(Node));head->next = NULL;```3. 插入新节点插入新节点时需要先创建一个新的节点,并将其插入到链表中合适的位置。
```Node *new_node = NULL;new_node = (Node*)malloc(sizeof(Node));new_node->data = new_data;// 找到插入位置Node *current = head;while (current->next != NULL && current->next->data < new_data) {current = current->next;}// 插入新节点new_node->next = current->next;current->next = new_node;```4. 删除指定数据的节点删除指定数据的节点时需要先找到该节点,并将其从链表中删除。
```// 找到要删除的节点Node *current = head;while (current->next != NULL && current->next->data != data) {current = current->next;}// 删除节点if (current->next != NULL) {Node *del_node = current->next;current->next = del_node->next;free(del_node);```5. 遍历链表遍历链表时需要从头节点开始,依次访问每个节点的数据。
中南大学数据结构实验报告
[键入文档副标题][键入文档标题]实验题目:(1)单链表的实现(2)栈和队列(3)二叉树的遍历(4)查找与排序学生姓名:代巍学生学号:0909121615指导老师:余腊生所在学院:信息科学与工程学院专业班级:信息安全1201班指导教师评定:签名:实验一单链表的实现一、实验目的了解线性表的逻辑结构和各种存储表示方法,以及定义在逻辑结构上的各种基本运算及其在某种存储结构上如何实现这些基本运算。
在熟悉上述内容的基础上,能够针对具体应用问题的要求和性质,选择合适的存储结构设计出相应的有效算法,解决与线性表相关的实际问题二、实验内容用C/C++语言编写程序,完成以下功能:(1)运行时输入数据,创建一个单链表(2)可在单链表的任意位置插入新结点(3)可删除单链表的任意一个结点(4)在单链表中查找结点(5)输出单链表三、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)用一组地址任意的存储单元存放线性表中的数据元素。
以元素(数据元素的映象) + 指针(指示后继元素存储位置) = 结点(表示数据元素或数据元素的映象)以“结点的序列”表示线性表称作线性链表(单链表)单链表是指数据接点是单向排列的。
一个单链表结点,其结构类型分为两部分:(1)、数据域:用来存储本身数据。
(2)、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。
1、单链表的查找对单链表进行查找的思路为:对单链表的结点依次扫描,检测其数据域是否是我们所要查好的值,若是返回该结点的指针,否则返回NULL。
2、单链表的插入因为在单链表的链域中包含了后继结点的存储地址,所以当我们实现的时候,只要知道该单链表的头指针,即可依次对每个结点的数据域进行检测。
假设在一个单链表中存在2个连续结点p、q(其中p为q的直接前驱),若我们需要在p、q之间插入一个新结点s,那么我们必须先为s分配空间并赋值,然后使p的链域存储s的地址,s的链域存储q的地址即可。
数据结构实验报告-实验一顺序表、单链表基本操作的实现
数据结构实验报告-实验⼀顺序表、单链表基本操作的实现实验⼀顺序表、单链表基本操作的实现l 实验⽬的1、顺序表(1)掌握线性表的基本运算。
(2)掌握顺序存储的概念,学会对顺序存储数据结构进⾏操作。
(3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能⼒。
l 实验内容1、顺序表1、编写线性表基本操作函数:(1)InitList(LIST *L,int ms)初始化线性表;(2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插⼊元素;(3)DeleteList1(LIST *L,int item)删除指定元素值的线性表记录;(4)DeleteList2(LIST *L,int rc)删除指定位置的线性表记录;(5)FindList(LIST *L,int item)查找线性表的元素;(6)OutputList(LIST *L)输出线性表元素;2、调⽤上述函数实现下列操作:(1)初始化线性表;(2)调⽤插⼊函数建⽴⼀个线性表;(3)在线性表中寻找指定的元素;(4)在线性表中删除指定值的元素;(5)在线性表中删除指定位置的元素;(6)遍历并输出线性表;l 实验结果1、顺序表(1)流程图(2)程序运⾏主要结果截图(3)程序源代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct LinearList/*定义线性表结构*/{int *list; /*存线性表元素*/int size; /*存线性表长度*/int Maxsize; /*存list数组元素的个数*/};typedef struct LinearList LIST;void InitList(LIST *L,int ms)/*初始化线性表*/{if((L->list=(int*)malloc(ms*sizeof(int)))==NULL){printf("内存申请错误");exit(1);}L->size=0;L->Maxsize=ms;}int InsertList(LIST *L,int item,int rc)/*item记录值;rc插⼊位置*/ {int i;if(L->size==L->Maxsize)/*线性表已满*/return -1;if(rc<0)rc=0;if(rc>L->size)rc=L->size;for(i=L->size-1;i>=rc;i--)/*将线性表元素后移*/L->list[i+=1]=L->list[i];L->list[rc]=item;L->size++;return0;}void OutputList(LIST *L)/*输出线性表元素*/{int i;printf("%d",L->list[i]);printf("\n");}int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/ {int i;for(i=0;i<L->size;i++)if(item==L->list[i])return i;return -1;}int DeleteList1(LIST *L,int item)/*删除指定元素值得线性表记录,返回值为>=0为删除成功*/ {int i,n;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(n=i;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return i;}return -1;}int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/{int i,n;if(rc<0||rc>=L->size)return -1;for(n=rc;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return0;}int main(){LIST LL;int i,r;printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);while(1){printf("请输⼊元素值,输⼊0结束插⼊操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d",&i);if(i==0)break;printf("请输⼊插⼊位置:");scanf("%d",&r);InsertList(&LL,i,r-1);printf("线性表为:");OutputList(&LL);}while(1){printf("请输⼊查找元素值,输⼊0结束查找操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d ",&i);if(i==0)break;r=FindList(&LL,i);if(r<0)printf("没有找到\n");elseprintf("有符合条件的元素,位置为:%d\n",r+1);}while(1){printf("请输⼊删除元素值,输⼊0结束查找操作:");fflush(stdin);/*清楚标准缓存区*/scanf("%d",&i);if(i==0)break;r=DeleteList1(&LL,i);if(i<0)printf("没有找到\n");else{printf("有符合条件的元素,位置为:%d\n线性表为:",r+1);OutputList(&LL);}while(1){printf("请输⼊删除元素位置,输⼊0结束查找操作:");fflush(stdin);/*清楚标准输⼊缓冲区*/scanf("%d",&r);if(r==0)break;i=DeleteList2(&LL,r-1);if(i<0)printf("位置越界\n");else{printf("线性表为:");OutputList(&LL);}}}链表基本操作l 实验⽬的2、链表(1)掌握链表的概念,学会对链表进⾏操作。
单链表实验总结
单链表实验总结单链表是一种常见的数据结构,用于存储有序的数据元素。
在这个实验中,我通过实现单链表的基本操作,如插入、删除和查找等,加深了对单链表的理解。
在实验中,我首先创建了一个单链表的类,并实现了构造函数。
然后,我实现了向链表中插入节点的操作。
插入节点时,我需要将新的节点的指针指向当前节点的下一个节点,然后将前一个节点的指针指向新的节点,从而完成节点的插入。
在实现删除节点的操作时,我需要找到要删除的节点的前一个节点,然后将前一个节点的指针指向要删除节点的下一个节点,从而将要删除的节点排除在链表之外。
我还实现了通过索引查找节点的操作。
在这个操作中,我需要从链表的头节点开始迭代,直到找到要查找的索引位置的节点。
通过实践,我发现单链表的插入和删除操作的时间复杂度都是O(n),其中n表示链表的长度。
在查找操作中,时间复杂度是O(n)。
总之,通过这个实验,我对单链表的原理和基本操作有了更深的理解。
我也学到了如何使用单链表来解决实际问题。
这个实验让我更加熟悉了链表的概念和操作,为我进一步深入学习数据结构和算法打下了基础。
除了实现基本的插入、删除和查找操作,我还尝试了一些其他的操作来进一步加深对单链表的理解。
首先,我实现了获取链表长度的操作。
通过遍历整个链表,我可以统计节点的数量来得到链表的长度。
这个操作的时间复杂度是O(n)。
接下来,我尝试实现了链表的反转操作。
通过调整节点的指针指向,我可以将链表的顺序颠倒过来。
这个操作的时间复杂度是O(n)。
另外,我实现了链表的判空和清空操作。
判空操作可以判断链表是否为空,即链表的头节点是否为空。
清空操作可以将链表中的所有节点都删除,使链表变为空链表。
最后,我尝试了一些高级操作,如链表的排序和链表的合并。
排序操作可以将链表中的节点按照一定的顺序重新排列,通常使用冒泡排序、选择排序或插入排序等算法实现。
合并操作可以将两个有序链表合并成一个更大的有序链表,通常使用归并排序的思想实现。
数据结构单链表实验报告
数据结构单链表实验报告数据结构单链表实验报告1. 引言数据结构是计算机科学中的重要基础,它研究数据的组织、存储和管理方式。
单链表是一种基本的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
本实验旨在通过实践操作单链表,加深对数据结构的理解。
2. 实验目的本实验的主要目的是掌握单链表的基本操作,包括创建链表、插入节点、删除节点和遍历链表。
通过实践操作,加深对链表的理解,提高编程能力和解决问题的能力。
3. 实验环境和工具本实验使用C语言进行编程实现,可以选择任何C语言开发环境,如Dev-C++、Code::Blocks等。
在编程过程中,可以使用任何文本编辑器编写代码。
4. 实验步骤4.1 创建链表首先,需要定义一个节点结构体,包含数据和指向下一个节点的指针。
然后,通过动态内存分配来创建链表的第一个节点,并将其地址赋给头指针。
接下来,可以通过输入数据的方式,逐个创建链表的其他节点。
4.2 插入节点在链表中插入节点是一种常见的操作。
可以在链表的任意位置插入一个新节点,只需要修改相应节点的指针即可。
首先,需要找到插入位置的前一个节点,然后将新节点的指针指向原来的下一个节点,再将前一个节点的指针指向新节点。
4.3 删除节点删除链表中的节点也是一种常见的操作。
可以根据节点的值或位置来删除节点。
首先,需要找到要删除的节点的前一个节点,然后将前一个节点的指针指向要删除节点的下一个节点,最后释放要删除节点的内存空间。
4.4 遍历链表遍历链表是一种查看链表中所有节点的操作。
可以通过循环遍历链表中的每个节点,输出节点的值或进行其他操作。
需要注意的是,遍历链表时需要使用一个临时指针来指向当前节点,以便于移动到下一个节点。
5. 实验结果与分析通过实验,我们成功实现了单链表的创建、插入、删除和遍历操作。
在实际应用中,单链表可以用于实现各种数据结构和算法,如栈、队列和图等。
它具有灵活性和高效性的特点,可以方便地进行节点的插入和删除操作。
单链表的实现及其基本操作
单链表的实现及其基本操作结点的引⼊链表是⼀种链式存储结构,链式存储结构的特点是⽤⼀组任意的存储单元存储数据元素。
为了能正确表⽰数据元素之间的线性关系,需引⼊结点概念。
⼀个结点表⽰链表中的⼀个数据元素,节点中除了储存数据元素的信息,还必须存放指向下⼀个节点的的指针(单、双链表的最后⼀个节点除外,它们存储的是⼀个空指针NULL)结点的结构如下图所⽰:代码如下:1 typedef struct node{2int data;3struct node* pNext;4 }Node, *PNode;View Code注:这⾥假设结点中储存的是整型 (int) 的数据单链表由多个结点依次连接⽽成,我们不难想象出它结构:我们注意到:在第⼀个结点的前⾯多了⼀个头结点,这是为了处理空表的⽅便⽽引⼊的,它的指针指向链表的第⼀个结点,⽽它的data域不存放任何信息。
单链表的基本操作1.创建链表1 PNode createList()2 {3int len, value;45 PNode pHead = (PNode)(malloc(sizeof(Node)));6 PNode pTail = pHead;7 pTail->pNext = NULL;89 printf("请输⼊你要的节点个数:");10 scanf("%d", &len);11for(int i=1;i<=len;i++){12 printf("请输⼊第%d个节点的值:", i);13 scanf("%d", &value);1415 PNode pNew = (PNode)malloc(sizeof(Node));16 pNew->data = value;17 pTail->pNext = pNew;18 pTail = pNew;19 pTail->pNext = NULL;20 }2122return pHead;23 }View Code2.遍历链表void traverse(PNode pHead){printf("遍历结果为:\n");PNode pTra = pHead;while(pTra->pNext != NULL){printf("%d ", pTra->pNext->data);pTra = pTra->pNext;}printf("\n");}View Code3.判断链表是否为空1bool isEmpty(PNode pHead)2 {3if(pHead->pNext==NULL)4return true;5else6return false;7 }View Code4.链表长度1int length(PNode pHead)2 {3int len = 0;4while(pHead->pNext!=NULL){5 pHead = pHead->pNext;6 len++;7 }8return len;910 }View Code5.插⼊结点1bool insert(PNode pHead, int pos, int val)2 {3if(pos<1 || pos>length(pHead)){4return false;5 }else{6 PNode pInsert = pHead;7for(int i=1;i<pos;i++){8 pInsert = pInsert->pNext;9 }1011 PNode pNew = (PNode)malloc(sizeof(Node));12 pNew->data = val;13 pNew->pNext = pInsert->pNext;14 pInsert->pNext = pNew;1516return true;17 }1819 }View Code6.删除结点1bool del(PNode pHead, int pos)2 {3if(pos<1 || pos>length(pHead)){4return false;5 }else{6 PNode pDel = pHead;7for(int i=1;i<pos;i++){8 pDel = pDel->pNext;9 }1011if(pos==length(pHead)){12free(pDel->pNext);13 pDel->pNext = NULL;14 }else{15 PNode pNext = pDel->pNext->pNext;16free(pDel->pNext);17 pDel->pNext = pNext;18 }1920return true;2122 }232425 }View Code7.查找节点(1)按元素值查找1 PNode locate(PNode pHead, int value)2 {3 PNode p = pHead->pNext;4while(p&&p->data!=value){ //NULL 是 05 p = p->pNext;6 }7return p;8 }View Code(2)按序号查找1 PNode get(PNode pHead, int k)2 {3 PNode p = pHead;4for(int i=1;i<=k;i++){5 p = p->pNext;6 }7return p;89 }View Code完整代码1 #include<stdio.h>2 #include<stdlib.h>3 typedef struct node{4int data;5struct node* pNext;6 }Node, *PNode;78 PNode createList();9void traverse(PNode pHead);10bool isEmpty(PNode pHead);11int length(PNode pHead);12bool insert(PNode pHead, int pos, int val);13bool del(PNode pHead, int pos);14 PNode get(PNode pHead, int k); //按序号查找15 PNode locate(PNode pHead, int value);//按值查找 1617int main(void)18 {19//test2021return0;22 }2324 PNode createList()25 {26int len, value;2728 PNode pHead = (PNode)(malloc(sizeof(Node)));29 PNode pTail = pHead;30 pTail->pNext = NULL;3132 printf("请输⼊你要的节点个数:");33 scanf("%d", &len);34for(int i=1;i<=len;i++){35 printf("请输⼊第%d个节点的值:", i);36 scanf("%d", &value);3738 PNode pNew = (PNode)malloc(sizeof(Node));39 pNew->data = value;40 pTail->pNext = pNew;41 pTail = pNew;42 pTail->pNext = NULL;43 }4445return pHead;46 }474849void traverse(PNode pHead)50 {51 printf("遍历结果为:\n");52 PNode pTra = pHead;53while(pTra->pNext != NULL)54 {55 printf("%d ", pTra->pNext->data);56 pTra = pTra->pNext;57 }58 printf("\n");59 }6061bool isEmpty(PNode pHead)62 {63if(pHead->pNext==NULL)64return true;65else66return false;67 }6869int length(PNode pHead)70 {71int len = 0;72while(pHead->pNext!=NULL){73 pHead = pHead->pNext;74 len++;75 }76return len;7778 }7980bool insert(PNode pHead, int pos, int val)81 {82if(pos<1 || pos>length(pHead)){83return false;84 }else{85 PNode pInsert = pHead;86for(int i=1;i<pos;i++){87 pInsert = pInsert->pNext;88 }8990 PNode pNew = (PNode)malloc(sizeof(Node));91 pNew->data = val;92 pNew->pNext = pInsert->pNext;93 pInsert->pNext = pNew;9495return true;96 }9798 }99100bool del(PNode pHead, int pos)101 {102if(pos<1 || pos>length(pHead)){103return false;104 }else{105 PNode pDel = pHead;106for(int i=1;i<pos;i++){107 pDel = pDel->pNext;108 }109110if(pos==length(pHead)){111free(pDel->pNext);112 pDel->pNext = NULL;113 }else{114 PNode pNext = pDel->pNext->pNext;115free(pDel->pNext);116 pDel->pNext = pNext;117 }118119return true;120121 }122123124 }125126 PNode get(PNode pHead, int k)127 {128 PNode p = pHead;129for(int i=1;i<=k;i++){130 p = p->pNext;131 }132return p;133134 }135 PNode locate(PNode pHead, int value)136 {137 PNode p = pHead->pNext;138while(p&&p->data!=value){ //NULL 是 0 139 p = p->pNext;140 }141return p;142 }View Code。
单链表创建、删除、查找、插入之C语言实现
单链表创建、删除、查找、插⼊之C语⾔实现本⽂将详细的介绍C语⾔单链表的创建、删除、查找、插⼊以及输出功能⼀、创建#include<stdio.h>#include<stdlib.h>typedef int ElemType;/*结构体部分*/typedef struct Node{ElemType data; //数值域struct Node *next; //指针域}Linklist;Linklist *InitList(Linklist *L) //初始化单链表{L = (Linklist *) malloc(sizeof(Linklist));L->next = NULL;return L;}Linklist *CreateList(int n){/*通过输⼊n个数据,创建⼀个单链表*/int x,i;Linklist *L,*r,*p;L = InitList(L); //构造头结点r = L;printf("input %d value: ",n);for(i=0;i<n;i++){scanf("%d",&x);p = (Linklist *)malloc(sizeof(Linklist));p -> data = x;p -> next = NULL;r->next = p;r = r->next; //指针r始终指向链表中末数据元素所在位置}return L;}⼆、插⼊int InsItem1(Linklist *L,ElemType item,int x) /*给定的序号来插⼊*/{int i = 1;Linklist *p,*t;p = L;t = (Linklist *)malloc(sizeof(Linklist));t ->data = item;if(L->next==NULL){ /*若L为空表且要求将新结点插⼊到第0个位置*/if(x==1){L->next=t;t->next=NULL;return1;}/*若L为空表且要求将新结点插⼊到第⾮0个位置,则操作失败*/else{printf("wrong!\n");return0;}}while(p->next!=NULL&&i<x)/*查找第i个节点*/{p = p->next;i++;}if(p->next==NULL&&i<x)/*在表中不存在插⼊位置i ,找不到,则插⼊操作失败*/{printf("The node %d is not exist\n",x);return0;}elset->next = p->next;p->next = t;return1;}}int InsItem2(Linklist *L,ElemType item,ElemType k) /*插⼊给定值在链表中的位置*/ {Linklist *q,*p,*t;t = (Linklist *)malloc(sizeof(Linklist));t->data = item;if(L->next==NULL){printf("The linklist is empty\n");return0;}else{q = L;p = L->next;while(p->next!=NULL)/*查找值为k的结点*/{if(p->data!=k){q = p;p = p->next;}elsebreak;}if(p==NULL)/*如p= =NULL,则没有值为k的结点,插⼊操作失败*/{printf("The node %d is not exist\n",k);return0;}else{q->next = t;t->next = p;return1;}}}三、删除int DelItem(Linklist *L,int x)//在单链表中删除数据元素{int i = 1;Linklist *p,*q;p = L;if(L->next==NULL) /*L为空表,⽆结点可删除*/{printf("The linklist is empty!\n");return0;}while(p->next!=NULL&&i<x){p = p->next;i++;}if(p->next==NULL)/*若没有第i个结点,则删除操作失败*/{printf("The node %d is not exist\n",x);return0;}else{q = p->next;p->next = p->next->next;free(q);return1;}}四、查找int LocItem(Linklist *L,ElemType x)//查找给定值的结点位置Linklist *p,*q,*r;int i = 1;if(L->next==NULL){printf("The linklist is empty\n");return0;}else{p = L->next;while(p!=NULL){if(p->data!=x){i++;p = p->next;}elsebreak;}if(p==NULL)/*如p= =NULL,则没有值为item的结点,删除操作失败*/ {printf("The node %d is not exist\n",x);return0;}/*若找到该节点返回该节点的位置*/elsereturn i;}}五、输出void output(Linklist *L) //输出{Linklist *p;p = L->next;printf("output element: \n");for(;p!=NULL;p=p->next){printf(" %d ",p->data);}printf("\n");}六、主函数部分int main(){ElemType x = 5;Linklist *L;L = CreateList(x);output(L);InsItem1(L,3,2);output(L);InsItem1(L,3,4);output(L);DelItem(L,3);output(L);printf("3的位置是: %d",LocItem(L,3));}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.单链表的基本操作的实现①单链表的创建及初始化LinkList InitList()//创建单链表{int ListInsert(LinkList L,int i,char e[20]);//这里是声明LinkList L=(LinkList)malloc(sizeof(LNode));//产生头结点L,并使L指向此头结点,头节点的数据域是不放数据的L->next=NULL;// 指针域为空//LinkList p;int num=1;char date[20],e[20];cout<<"请输入第"<<num<<"个元素,输入ok结束:";cin>>date;while(strcmp(date,"ok")!=0)//strcmp是比较字符如果相符返回真不相符返回假是string中的函数{//p=(LinkList)malloc(sizeof(LNode));strcpy(e,date); //strcpy 拷贝字符是string中的函数ListInsert(L,num,e);num++;cout<<"请输入第"<<num<<"个元素,输入ok结束:";cin>>date;}return(L);}②销毁void DestroyList(LinkList L)//销毁单链表{LinkList p=L,q=p->next;// 由于单链表的每一个元素是单独分配的,所以要一个一个的进行释放while(q!=NULL){free(p); //释放p=q;q=p->next;}free(p);}③获取元素int GetElem(LinkList L,int i,char e[20])//获取元素{int j = 1; // j为计数器,书上是从0开始,因为头结点是没有数据的所以我就从1开始可以省略一步操作LinkList p=L->next; // p指向头结点之后的节点也就是第一个有数据的节点while(p!=0&&j<i) // 顺指针向后查找,直到p指向第i个元素或p为空{p=p->next;j++;}if(p==NULL || j>i) // 第i个元素不存在返回0return 0;else{e=p->data; // 取第i个元素return 1;}}④插入元素int ListInsert(LinkList L,int i,char e[20])// 在带头结点的单链线性表L中第i个位置之前插入元素e {int j=0; //这里j同样是作为计数器使用LinkList p=L,s;while(p!=NULL&&j<i-1) // 寻找第i-1个结点{p=p->next;j++;}if(p==NULL||j>i-1) // i小于1或者大于表长return 0;else{s=(LinkList)malloc(sizeof(LNode)); // 生成新结点strcpy(s->data,e); // 插入L中s->next=p->next;p->next=s;return 1;}}⑤删除元素int ListDelete(LinkList L, int i,char e[20])//删除第i个元素{int j = 0;LinkList p=L,q;while(p!=NULL && j<i-1) // 寻找第i个结点,并令p指向其前趋{p=p->next;j++;}if(p==NULL||j>i-1) // 删除位置不合理return 0;else{q=p->next; // 删除并释放结点p->next=q->next;e=q->data;free(q);return 1;}}4.单链表使用源程序清单:#include<iostream.h>#include<malloc.h>#include<stdlib.h>#include<string.h>#define NULL 0typedef struct LNode{char data[20];struct LNode *next;}LNode, *LinkList;int ListInsert(LinkList L,int i,char e[20])// 在带头结点的单链线性表L中第i个位置之前插入元素e {int j=0; //这里j同样是作为计数器使用LinkList p=L,s;while(p!=NULL&&j<i-1) // 寻找第i-1个结点{p=p->next;j++;}if(p==NULL||j>i-1) // i小于1或者大于表长return 0;else{s=(LinkList)malloc(sizeof(LNode)); // 生成新结点strcpy(s->data,e); // 插入L中s->next=p->next;p->next=s;return 1;}}int ListDelete(LinkList L, int i,char e[20])//删除第i个元素{int j = 0;LinkList p=L,q;while(p!=NULL && j<i-1) // 寻找第i个结点,并令p指向其前趋{p=p->next;j++;}if(p==NULL||j>i-1) // 删除位置不合理return 0;else{q=p->next; // 删除并释放结点p->next=q->next;e=q->data;free(q);return 1;}}LinkList InitList()//创建单链表{int ListInsert(LinkList L,int i,char e[20]);//这里是声明LinkList L=(LinkList)malloc(sizeof(LNode));//产生头结点L,并使L指向此头结点,头节点的数据域是不放数据的L->next=NULL;// 指针域为空//LinkList p;int num=1;char date[20],e[20];cout<<"请输入第"<<num<<"个元素,输入ok结束:";cin>>date;while(strcmp(date,"ok")!=0)//strcmp是比较字符如果相符返回真不相符返回假是string中的函数{//p=(LinkList)malloc(sizeof(LNode));strcpy(e,date); //strcpy 拷贝字符是string中的函数ListInsert(L,num,e);num++;cout<<"请输入第"<<num<<"个元素,输入ok结束:";cin>>date;}return(L);}void DestroyList(LinkList L)//销毁单链表{LinkList p=L,q=p->next;// 由于单链表的每一个元素是单独分配的,所以要一个一个的进行释放while(q!=NULL){free(p); //释放p=q;q=p->next;}free(p);}void printList(LinkList L)//打印单链表{cout<<"\n--------------------------------------\n"<<" 序号元素\n"<<"--------------------------------------\n";LinkList p=L;int n=1;if(L==NULL||L->next==NULL)cout<<"单链表中没有元素\n";elsewhile(p->next!=NULL){cout<<" "<<n<<" "<<p->next->data<<"\n";p=p->next;n++;}cout<<"--------------------------------------\n";}int GetElem(LinkList L,int i,char e[20])//获取元素{int j = 1; // j为计数器,书上是从0开始,因为头结点是没有数据的所以我就从1开始可以省略一步操作LinkList p=L->next; // p指向头结点之后的节点也就是第一个有数据的节点while(p!=0&&j<i) // 顺指针向后查找,直到p指向第i个元素或p为空{p=p->next;j++;}if(p==NULL || j>i) // 第i个元素不存在返回0return 0;else{e=p->data; // 取第i个元素return 1;}}void main(){int xuhao,YON=0;//这里YON是用来判断是否已经建立链表建立则为1 未建立则为0LinkList L=NULL;cout<<"|*******************************单链表的基本操作*******************************|"<<"| 1.创建单链表|"<<"| 2.插入元素|"<<"| 3.获取元素|"<<"| 4.删除元素|"<<"| 5.销毁单链表|"<<"| 6.打印单链表|"<<"| 0.退出|"<<"|******************************************************************************|"<<en dl<<"请输入单链表操作的序列号,按Enter键确定:";cin>>xuhao;while(xuhao!=0){switch(xuhao){case 1:{InitList();YON=1;//这里YON是用来判断是否已经建立链表建立则赋值为1break;}case 2:{if(YON==1){int i;char date[20];cout<<"请输入你要插入的元素:";cin>>date;cout<<"请输入要插入的位置:";cin>>i;LinkList p=(LinkList)malloc(sizeof(LNode));strcpy(p->data,date);ListInsert(L,i,date);cout<<"插入后:";printList(L);}else{cout<<"还没有创建链表,请先建立链表\n";}break;}case 3:{int i;char e[20];if(YON==1){cout<<"请输入要查找元素的序号:";cin>>i;GetElem(L,i,e);cout<<"要查找的元素是:"<<e<<”\n”;}else cout<<"单链表中没有元素!\n";break;}case 4:{int i;char e[20];cout<<"请输入要删除元素的序号:";cin>>i;ListDelete(L,i,e);cout<<"删除后:";printList(L);break;}case 5:{DestroyList(L);break;}case 6:printList(L);break;case 0:exit(0);default:{cout<<"没有此功能请重新输入";};cout<<"请选择操作:";cin>>xuhao;}}5.实验结果1.程序界面2.创建操作4.删除元素5.获取元素实验总结:.单链表的优缺点:优点:耗存储空间小,缺点:访问时,必须从头开始,耗时在这次试验中出现了很多问题,也学习到了一些新的函数如:strcmp,strcpy等一些字符操作函数,发现就算是一个很简单的地方也要细心,很多地方都是自己不认真造成的,要认真对待每一个问题,不懂就问别人或者上网查直到弄懂它,不能敷衍了事。