(续)顺序表之单循环链表(C语言实现)
单循环链表和单链表的唯一区别在于单循环链表的最后一个节点的指针域指向第一个节点,
使得整个链表形成一个环.
C实现代码如下:
- #include<stdio.h>
- typedef struct node
- {
- int data;
- struct node *next;
- }Node;
- //链表的初始化
- Node* InitList(int number)
- {
- int i;
- Node *pHead=(Node *)malloc(sizeof(Node));
- Node *TempHead=pHead;
- Node *Head=pHead;
- int data;
- for(i=;i<number;i++)
- {
- pHead=(Node *)malloc(sizeof(Node));
- printf("Please input the %dst node data:\n",i+);
- scanf("%d",&data);
- pHead->data=data;
- pHead->next=Head->next;
- TempHead->next=pHead;
- TempHead=TempHead->next;
- }
- return Head;
- }
- //显示链表
- void ShowList(Node *Head)
- {
- Node *TempNode=Head;
- TempNode=TempNode->next;
- printf("Show List:\n");
- while(TempNode->next!=Head->next)
- {
- printf("%d ",TempNode->data);
- TempNode=TempNode->next;
- }
- printf("%d",TempNode->data);
- printf("\n");
- }
- //输出链表某个值的位置
- int ListLocation(Node *Head,int data,int number)
- {
- Node *TempNode=Head;
- int location=;
- TempNode=TempNode->next;
- while(TempNode->next!=Head->next)
- {
- if(TempNode->data==data)
- {
- return location;
- }
- location++;
- TempNode=TempNode->next;
- }
- if(location>=number)
- printf("Not found!");
- }
- //输出链表某个位置的值
- int ListData(Node *Head,int location,int number)
- {
- if(location>number)
- printf("Not found!");
- Node *TempNode=Head;
- TempNode=TempNode->next;
- int i;
- for(i=;i<=number;i++)
- {
- if(location==i)
- return TempNode->data;
- TempNode=TempNode->next;
- }
- }
- //头入法插入元素
- void HeadInsertData(Node *Head,int data)
- {
- Node *TempNode=Head;
- Node *InsertNode=(Node *)malloc(sizeof(Node));
- InsertNode->data=data;
- while(TempNode->next->next!=Head->next)
- TempNode=TempNode->next;
- TempNode=TempNode->next;
- InsertNode->next=Head->next;
- TempNode->next=InsertNode;
- Head->next=InsertNode;
- }
- //尾入插入除元素
- void TailInsertData(Node *Head,int data)
- {
- Node *TempNode=Head;
- Node *InsertNode=(Node *)malloc(sizeof(Node));
- InsertNode->data=data;
- while(TempNode->next->next!=Head->next)
- TempNode=TempNode->next;
- TempNode=TempNode->next;
- TempNode->next=InsertNode;
- InsertNode->next=Head->next;
- }
- //删除头结点
- void HeadDeleteData(Node *Head)
- {
- Node *TempNode=Head;
- while(TempNode->next->next!=Head->next)
- TempNode=TempNode->next;
- TempNode->next->next=Head->next->next;
- Head->next=Head->next->next;
- }
- //删除尾结点
- void TailDeleteData(Node *Head)
- {
- Node *TempNode=Head->next;
- while(TempNode->next!=Head->next)
- {
- TempNode=TempNode->next;
- if(TempNode->next->next==Head->next)
- break;
- }
- TempNode->next=Head->next;
- }
- int main()
- {
- Node *Head;
- int number;
- printf("Please input the node number:\n");
- scanf("%d",&number);
- Head=InitList(number);
- printf("The initital list is:\n");
- ShowList(Head);
- int flag;
- printf("\n\n");
- printf("**********************Your Choice********************\n");
- printf("****************1-输出链表某个值的位置***************\n");
- printf("****************2-输出链表某个位置的值***************\n");
- printf("****************3-头入法插入元素*********************\n");
- printf("****************4-尾入法插入元素*********************\n");
- printf("****************5-删除头结点*************************\n");
- printf("****************6-删除尾结点*************************\n");
- printf("****************0-退出*******************************\n");
- printf("\n\n");
- printf("Please input flag:\n");
- scanf("%d",&flag);
- switch(flag)
- {
- case :
- {
- int data;
- printf("Please input the data you want locate:\n");
- scanf("%d",&data);
- int location;
- location=ListLocation(Head,data,number);
- printf("The data's location is: %d",location);
- break;
- }
- case :
- {
- int location;
- printf("Please input the location you want data:\n");
- scanf("%d",&location);
- int data;
- data=ListData(Head,location,number);
- printf("The location's data is: %d\n",data);
- break;
- }
- case :
- {
- int data;
- printf("Please input the data you want insert in head:\n");
- scanf("%d",&data);
- HeadInsertData(Head,data);
- ShowList(Head);
- break;
- }
- case :
- {
- int data;
- printf("Please input the data you want insert in tail:\n");
- scanf("%d",&data);
- TailInsertData(Head,data);
- ShowList(Head);
- break;
- }
- case :
- {
- HeadDeleteData(Head);
- ShowList(Head);
- break;
- }
- case :
- {
- TailDeleteData(Head);
- ShowList(Head);
- break;
- }
- case :
- {
- printf("You choose to exit.\n");
- break;
- }
- }
- return ;
- }
结果图:
(续)顺序表之单循环链表(C语言实现)的更多相关文章
- 【线性表基础】顺序表和单链表的插入、删除等基本操作【Java版】
本文表述了线性表及其基本操作的代码[Java实现] 参考书籍 :<数据结构 --Java语言描述>/刘小晶 ,杜选主编 线性表需要的基本功能有:动态地增长或收缩:对线性表的任何数据元素进行 ...
- 线性表源码分享(c++),包含顺序表、单链表、循环链表、双向链表
---恢复内容开始--- 我是一个c++和数据结构的初学者,本文主要是把清华大学出版社的数据结构(用面向对象方法与c++语言描述)(第2版)这本书中第二章线性表的源码抄下来,在学习的过程中有助于加深印 ...
- 顺序表的基本操作【c语言】【创建、插入、删除、输出】
作为数据结构初学者,上课时对一些知识点掌握得不是很透彻,所以利用课余时间通过微博平台总结所学知识,加深对知识的见解,记录学习历程便于后需要时参考. #include<stdio.h> #i ...
- 顺序表及基本操作(C语言)
#include <stdio.h> #include <stdlib.h> //基本操作函数用到的状态码 #define TRUE 1; #define FALSE 0; # ...
- Java: 实现顺序表和单链表的快速排序
快速排序 快速排序原理 快速排序(Quick Sort)的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到 ...
- K:顺序表和链表的比较
顺序表和链表是线性表的两种基本实现形式(链表还有多种变化形式),对于这两种实现方式,没有一种方法可以称是最好的,他们各自有着各自的特点和优缺点,适用于不同的应用场景. 与顺序表相比,链表较为灵活, ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- 【数据结构】之顺序表(Java语言描述)
之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...
- C语言实现顺序表(顺序存储结构)
顺序表(顺序存储结构)及初始化过程详解 顺序表,全名顺序存储结构,是线性表的一种.通过<线性表>一节的学习我们知道,线性表用于存储逻辑关系为"一对一"的数据,顺序表自然 ...
随机推荐
- Jump Game II 解答
Question Given an array of non-negative integers, you are initially positioned at the first index of ...
- python爬虫系列之爬取多页gif图像
python爬取多页gif图像 作者:vpoet mail:vpoet_sir@163.com #coding:utf-8 import urllib import ur ...
- linux 修改文件、文件夹权限
# change owner of all the fies under dirName chown -R username dirName #change owner and the file gr ...
- Calculation(dfs+状压dp)
Problem 1608 - Calculation Time Limit: 500MS Memory Limit: 65536KB Total Submit: 311 Accepted: ...
- A Bug's Life
#include<stdio.h> #include<string.h> ],num[]; int find(int x){ int r=x; while(r!=bug[r]) ...
- 浅谈postMessage多页面监听事件
最近做了一个Echarts和Highcharts多图多页面连动的效果,就用到postMessage 如下介绍: 最开始在最外围的页面也就是所有页面的父级页面添加postMessage监听事件以便监听下 ...
- ASP.NET基于donetCHARTING的自动报表
1,首先需要添加引用ChartExtents.dll和donetCHARTING.dll,资源百度大把. 2,配置图片生成类. using System; using System.Data; usi ...
- No DEFAULT or UI configuration directive found!
虚拟机安装OracleLinux出错: No DEFAULT or UI configuration directive found! 解决方法:我使用第一条就成功了 在报错信息后面的boot命令行输 ...
- JSP 基础之 JSTL <c:forEach>用法
在JSP的开发中,迭代是经常要使用到的操作.例如,逐行的显示查询的结果等.在早期的JSP中,通常使用Scriptlets来实现Iterator或者Enumeration对象的迭代输出.现在,通过JST ...
- CodeForces 698A - Vacations (Codeforces Round #363 (Div. 2))
要么去体育馆,要么去比赛,要么闲在家里 给出每一天体育馆和比赛的有无情况,要求连续两天不能去同一个地方 问最少闲几天 DP方程很容易看出 dp(第i天能去的地方) = min(dp(第i-1天的三种情 ...