单链表的链式表示和实现(含代码)
来源:互联网 发布:天蝎网络第三季百度云 编辑:程序博客网 时间:2024/04/25 07:23
代码
#include<stdio.h>#include<iostream>using namespace std;typedef struct LNode{ int data; //结点的数据域 struct LNode *next; //结点的指针域}LNode, *LinkList; //LinkList为指向结构体LNode的指针类型LinkList createList_first(LinkList &L,int n);LinkList createList_last(LinkList &L, int n);void print(LinkList &head);bool isEmpty(LinkList L);void print(LinkList &head);bool isEmpty(LinkList L);int GetLength(LinkList &head);bool insertList_L(LinkList &L, int position, int data);bool deleteList_L(LinkList &L,int position); /*逆位为序输入n个元素的值,建立带头结点的单链表L O(n) */// 前插法是通过将新节点组个插入链表的头部(头结点之后)来创建链表。// 首先建立只有头结点的空链表,// 没读入一个数据元素则申请一个新的结点,// 并将新节点插入到头结点之后。LinkList createList_first(LinkList &L,int n) { L = new LNode; L->data = 2013211553; //头结点里面的输入我的学号 ^_^ ,方便做测试用 L->next = NULL; //先建立一个带头结点的空链表 printf(" ***********前插法创建单链表,请输入%d个数****************\n",n); for(int i = n; i > 0; i--) { LNode* p = new LNode; //生成新结点 cin>>p->data; //输入元素 p->next = L->next; L->next = p; //插入到表头 } print(L); return L;} /*正为序输入n个元素的值,建立带头结点的单链表L O(n)*/// 后插法是通过将新节点逐个插入到链表的尾部来创建链表。// 首先要建立一个只有头结点的空链表L,为了使新节点能够插入到表尾,// 需要增加一个尾指针endNode指向链表的尾结点// 初始时,endNode均指向头结点。每读入一个数据元素则申请一个新的结点,// 将新节点插入到尾结点之后,然后使endNode指向新的尾结点LinkList createList_last(LinkList &L, int n) { L = new LNode; L->data = 2013211553; L->next = NULL; printf(" **********尾插法创建单链表,请输入%d个数**********\n",n); LNode* endNode = L; for(int i = 0; i < n; i++) { LNode* p = new LNode; cin>>p->data; p->next = NULL; endNode->next = p; //插入到表尾 endNode = p; //endNode指向新的尾结点 } print(L); return L;}/*该函数用于遍历输出链表所有元素(包括头链表的结点信息)*/void print(LinkList &head) { if(head == NULL) return; LNode* node = head->next; printf(" **********遍历输出链表所有元素**********\n"); printf(" 头结点里面的数据信息: %d\n",head->data); printf("链表中的实际元素(除头结点外)为"); for(int i = 1; node != NULL; i++) { printf(" %d ",node->data); node = node->next; }}bool isEmpty(LinkList L) { if(L->next == NULL) return false; else return true;} /*在带头结点的单链表L中查找的第i*/bool GetElem_L(LinkList L,int i) { printf(" **********在带头结点的单链表查找元素**********\n"); bool flag = false; LNode* p = L->next; //初始化,node 指向第一个结点, int j = 1; //初始化, j为计数器 while(p && j < i) { //顺链域向后扫描,直到node指向第i个元素或p为空 p = p->next; j++; } if(!p ||j>i){ //第i个元素不在 printf("没有第%d个位置的元素\n",i); } else { printf(" 第%d个位置的元素是 %d\n",i,p->data); } return flag;}int GetLength(LinkList &head) { int length = 0; LNode* node = head->next; for(length ; node != NULL;length++) { node = node->next; } return length;} /* 在带头结点的单链表L中第posion个位置之前插入元素data*/// (1) 找到结点A(position-1)并由指针p指向该节点// (2) 生成一个新的结点*node// (3) 将新结点点*node的数据设置为data// (4) 将新节点*node的指针指向结点A(position)// (5) 令结点A(position-1)的指针域指向新的结点*nodebool insertList_L(LinkList &L, int position, int data){ bool flag = false; LNode* p = L; int j = 0; while(p&&j<position-1){ //寻找第position-1个结点 p = p->next; j++; } if(!p||j>position-1) //i大于表长+1或者小于1 flag = false; LNode* node = new LNode; //新生结点 node->data = data; //将结点node的数据域设置为data node->next = p->next; //将结点node插入表L中 p->next = node; flag = true; print(L); return flag;} /*在带头结点的单链表L中,删除第position个元素*/// 找到结点 A(position-1)并由指针p指向该结点 // 临时保存待删除结点A(position)的地址在node, 以便释放// 令p->next指向A(position)的直接后继结点// 释放结点A(position)的空间bool deleteList_L(LinkList &L,int position) { bool flag = false; LNode* p = L; int j = 0; while((p->next)&&j<position-1) { //寻找第i-1个节点 p = p->next; j++; } if(!(p->next)||j>position-1) //i大于表长 + 1 或者小于1 flag = false; LNode* node = p->next; //临时保存被删除结点的地址以便释放 printf("\n\t删除的元素是 %d\n",node->data); p->next = node->next; //释放删除的结点空间 delete(node); print(L); return flag;}void main() { LNode* head = new LNode; //创建链表 int length = 0; printf("\t\t请输入链表的长度:"); scanf("%d",&length); getchar(); LinkList L = createList_last(head,length); //插入元素 int position = 0, data = 0; printf("\n\n\t\t请输入插入元素的位置和值:"); scanf("%d,%d",&position,&data); getchar(); insertList_L(L,position,data); //查找元素 int getelem = 0; printf("\n\n\t\t请输入要查找的元素位置"); scanf("%d",&getelem); getchar(); GetElem_L(L,getelem); //删除元素 int deletep = 0; printf("\n\n\t\t请输入要删除的元素位置"); scanf("%d",&deletep); getchar(); deleteList_L(L,deletep); //求链表的长度 int getlength = 0; getlength = GetLength(L); printf("\n\n\t\t链表的长度(除头结点)为:%d\n",getlength);}
运行结果截图
0 0
- 单链表的链式表示和实现(含代码)
- 线性表的链式表示和实现(链式)
- 严蔚敏--线性表的链式表示和实现 代码
- 线性表的链式表示和实现--单链表
- 线性表的链式表示和实现(单链表)
- 线性表的链式表示和实现(1)
- 线性表的链式表示和实现(C++版)
- 《数据结构》线性表的链式表示和实现(三)
- 数据结构---线性表的链式表示和实现(一)
- 数据结构---线性表的链式表示和实现(二)
- 线性表的链式表示和实现
- 队列的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 链式栈的表示和实现
- 链式队列的表示和实现
- 线性表的链式表示和实现
- 用Adobe Reader的“朗读”功能实现“少林修女GPS”语音提示
- 黑马程序员日记-14
- OO技术三大特点
- Unity shader中的法线详解
- 黑马程序员日记-15
- 单链表的链式表示和实现(含代码)
- map 遍历第二种方法 MapEntry
- jsp语法
- Android之ListView长按列表项弹出菜单 给菜单项添加事件 获取上下文
- Oracle监听器启动出错:OracleOraDb10g home1TNSListener服务启动后又停止
- 利用ssh传输文件
- 设计模式之装饰设计模式(一)类别
- linux centos7 cgroup 命令行操作
- BAT的校园大赛,都秀出了哪些肌肉?