先上干货:
单链表是一种常见的数据结构,它由节点(Node)组成,每个节点包含两个部分:数据域(Data)和指针域(Next)。数据域用于存储数据,指针域用于指向下一个节点。通过节点之间的指针连接,形成一个链式结构。
单链表的基本思想是利用节点之间的指针来建立节点之间的关系。链表的头节点作为入口点,通过头节点可以访问到链表中的所有节点。每个节点通过指针域指向下一个节点,最后一个节点的指针域指向空(NULL),表示链表的尾部。
对于链表的操作,主要包括以下几种:
相比于数组,链表的大小可以动态调整,插入和删除节点的时间复杂度为O(1)。但是链表的访问时间复杂度较高,需要从头节点开始顺序查找,时间复杂度为O(N)。
单链表在实际应用中经常用来解决需要频繁插入、删除和动态大小的问题,例如实现队列、栈、图等数据结构,以及处理大数据集合。
一、实验目的
1、掌握链表的建立、插入元素、删除表中某元素的算法。
2、对线链表相应算法的时间复杂度进行分析。
二、实验要求
1.实验前做好充分准备,包括复习第二章所学内容,事先预习好本次实验内容。
2.实验时记录实验结果,按要求完成各题。
3.实验结束后,给出实验总结与分析并及时给出本次实验的实验报告。
三、实验内容
1.完成并实现如下链表的基本操作。要求:编写测试函数运行程序,给出结果每个基本操作的运行截图。
(1)顺序表的定义
#include #include #include typedef int ElemType; //定义类型 typedef struct LNode //定义结点 { ElemType data; //数据域 struct LNode *next; //指向后继结点的指针域 }LNode,*PNode; //PNode为节点类型指针 typedef struct LinkList //定义链表 { PNode first; //头指针 PNode last; //尾指针 int list_size; //链表中有效元素个数 }LinkList; |
(2)顺序表的基本操作:
void InitLinkList(LinkList *list);//初始化顺序表
代码:
void InitLinkList(LinkList *list) { PNode head = _buyNode(-1); list->first = list->last = head; list->list_size=0; } |
LNode *_buyNode(ElemType Item);//新增结点
代码:
LNode *_buyNode(ElemType Item) { PNode p =(PNode)malloc(sizeof(LNode)); p->data = Item; p->next = NULL; } |
运行截图:
|
void push_front(LinkList *list,ElemType x);//向链表中头插结点
代码:
void push_front(LinkList *list,ElemType x) { PNode p = _buyNode(x); p->next = list->first->next; list->first->next= p; list->list_size++; } |
运行截图:
|
void push_back(LinkList *list,ElemType x);//向链表中尾插结点
代码:
void push_back(LinkList *list,ElemType x) { while(list->last->next!=NULL) { list->last=list->last->next; } PNode p = _buyNode(x); list->last->next=p; list->list_size++; } |
运行截图:
|
void showList(LinkList *list);//显示链表元素
代码:
void showList(LinkList *list) { PNode p = list->first->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } |
运行截图:
|
void pop_back(LinkList *list);//尾部删除结点
代码:
void pop_back(LinkList *list) { free(list->last->next); list->last->next=NULL; list->list_size--; } |
运行截图:
|
void pop_front(LinkList *list);//头部删除节点
代码:
void pop_front(LinkList *list) { list->first->next=list->first->next->next; list->list_size--; } |
运行截图:
|
int length_list(LinkList *list);//返回链表长度
代码:
int length_list(LinkList *list) { printf("%d\n",list->list_size); } |
运行截图:
|
void insertLinklist_pos(LinkList *list,int pos,ElemType key);//按照pos指定的位置插入元素
代码:
void insertLinklist_pos(LinkList *list,int pos,ElemType key) { PNode r=_buyNode(key); PNode p=_buyNode(NULL); p->next=list->first; for(int i=0;i { p=p->next; } r->next=p->next; p->next=r; list->list_size++; } |
运行截图:
|
void delete_LinkList_val(LinkList *list,ElemType x);//删除第一个值为x的元素
代码:
void delete_LinkList_val(LinkList *list,ElemType x) { PNode p=_buyNode(NULL); p=list->first; while(p->next->data!=x) { p=p->next; } p->next=p->next->next; list->list_size--; } |
运行截图:
|
void sortLinkList(LinkList *list); //排序
代码:
void sortLinkList(LinkList *list) { int i,j; PNode p=_buyNode(NULL); for(i=0;i { p=list->first->next; for(j=0;j { if(p->next->data { int a; a=p->data;p->data=p->next->data;p->next->data=a; } p=p->next; } } } |
运行截图:
|
void reverseLinkList(LinkList *list);//逆置链表元素
代码:
void reverseLinkList(LinkList *list) { int i,j; PNode p=_buyNode(NULL); for(i=0;i { p=list->first->next; for(j=0;j { if(p->next->data>p->data) { int a; a=p->data;p->data=p->next->data;p->next->data=a; } p=p->next; } } } |
运行截图:
|
int findval_val(LinkList *list,ElemType key);//查找链表中首个值为key的元素位置
代码:
int findval_val(LinkList *list,ElemType key) { int i=0; PNode p=_buyNode(NULL); p=list->first->next; while(p->data!=key) { p=p->next; i++; } if(p->data==key) printf("%d\n",i+1); else printf("没有找到\n"); } |
运行截图:
|
int countX(LinkList *list,ElemType x) // 统计大于某个值的节点个数代码:
int countX(LinkList *list,ElemType x) { PNode p=_buyNode(NULL); p=list->first->next;int a=0; for(int i=0;i { if(p->data>x)a++; p=p->next; } printf("%d\n",a); } |
运行截图:
|
void clearLinkList(LinkList *list);//清空单链表
代码:
void clearLinkList(LinkList *list) { PNode p=_buyNode(NULL); while (list->first->next) { p = list->first->next; list->first->next = p->next; p=NULL; } } |
运行截图:
|
void destroyLinkList(LinkList *list);//销毁单链表
代码:
void destroyLinkList(LinkList *list) { free(list->first->next); } |
运行截图:
|
#include
#include
#include
typedef int ElemType; //定义类型
typedef struct LNode //定义结点
{
ElemType data; //数据域
struct LNode *next; //指向后继结点的指针域
}LNode,*PNode; //PNode为节点类型指针
typedef struct LinkList //定义链表
{
PNode first; //头指针
PNode last; //尾指针
int list_size; //链表中有效元素个数
}LinkList;
void InitLinkList(LinkList *list);//初始化链表
LNode *_buyNode(ElemType Item);//新增结点
void push_front(LinkList *list,ElemType x);//向链表中头插结点
void push_back(LinkList *list,ElemType x);//向链表中尾插结点
void showList(LinkList *list);//显示链表元素
void pop_back(LinkList *list);//尾部删除结点
void pop_front(LinkList *list);//头部删除节点
int length_list(LinkList *list);//返回链表长度
void insertLinklist_pos(LinkList *list,int pos,ElemType key);//按照pos指定的位置插入元素
void delete_LinkList_val(LinkList *list,ElemType x);//删除第一个值为x的元素
void sortLinkList(LinkList *list); //排序
void reverseLinkList(LinkList *list);//逆置链表元素
int findval_val(LinkList *list,ElemType key);//查找链表中首个值为key的元素位置
int countX(LinkList *list,ElemType x); //统计大于某个值的节点个数
void clearLinkList(LinkList *list);//清空单链表
void destroyLinkList(LinkList *list);//销毁单链表
#include "LinkList.h"
void InitLinkList(LinkList *list)
{
}
LNode *_buyNode(ElemType Item)
{
}
void push_front(LinkList *list,ElemType x)
{
}
void push_back(LinkList *list,ElemType x)
{
}
void showList(LinkList *list)
{
}
void pop_back(LinkList *list)
{
}
void pop_front(LinkList *list)
{
}
int length_list(LinkList *list)
{
}
void insertLinklist_pos(LinkList *list,int pos,ElemType key)
{
}
void delete_LinkList_val(LinkList *list,ElemType x)
{
}
void sortLinkList(LinkList *list)
{
}
void reverseLinkList(LinkList *list)
{
}
int findval_val(LinkList *list,ElemType key)
{
}
int countX(LinkList *list,ElemType x)
{
}
void clearLinkList(LinkList *list)
{
}
void destroyLinkList(LinkList *list)
{
}
#include
#include "LinkList.h"
int main()
{
}