赞
踩
先上干货:
单链表是一种常见的数据结构,它由节点(Node)组成,每个节点包含两个部分:数据域(Data)和指针域(Next)。数据域用于存储数据,指针域用于指向下一个节点。通过节点之间的指针连接,形成一个链式结构。
单链表的基本思想是利用节点之间的指针来建立节点之间的关系。链表的头节点作为入口点,通过头节点可以访问到链表中的所有节点。每个节点通过指针域指向下一个节点,最后一个节点的指针域指向空(NULL),表示链表的尾部。
对于链表的操作,主要包括以下几种:
相比于数组,链表的大小可以动态调整,插入和删除节点的时间复杂度为O(1)。但是链表的访问时间复杂度较高,需要从头节点开始顺序查找,时间复杂度为O(N)。
单链表在实际应用中经常用来解决需要频繁插入、删除和动态大小的问题,例如实现队列、栈、图等数据结构,以及处理大数据集合。
一、实验目的
1、掌握链表的建立、插入元素、删除表中某元素的算法。
2、对线链表相应算法的时间复杂度进行分析。
二、实验要求
1.实验前做好充分准备,包括复习第二章所学内容,事先预习好本次实验内容。
2.实验时记录实验结果,按要求完成各题。
3.实验结束后,给出实验总结与分析并及时给出本次实验的实验报告。
三、实验内容
1.完成并实现如下链表的基本操作。要求:编写测试函数运行程序,给出结果每个基本操作的运行截图。
(1)顺序表的定义
#include <stdio.h> #include <assert.h> #include <malloc.h> 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<pos;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<list->list_size;i++) { p=list->first->next; for(j=0;j<list->list_size-1;j++) { if(p->next->data<p->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<list->list_size;i++) { p=list->first->next; for(j=0;j<list->list_size-1;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<list->list_size;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 <stdio.h>
- #include <assert.h>
- #include <malloc.h>
-
- 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 <stdio.h>
#include "LinkList.h"
int main()
{
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。