(续)顺序表之单循环链表(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=0;i<number;i++)
    {
        pHead=(Node *)malloc(sizeof(Node));
        printf("Please input the %dst node data:\n",i+1);
        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=1;
    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=1;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 1:
        {
            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 2:
        {
            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 3:
        {
            int data;
            printf("Please input the data you want insert in head:\n");
            scanf("%d",&data);
            HeadInsertData(Head,data);
            ShowList(Head);
            break;
        }
        case 4:
        {
            int data;
            printf("Please input the data you want insert in tail:\n");
            scanf("%d",&data);
            TailInsertData(Head,data);
            ShowList(Head);
            break;
        }
        case 5:
        {
            HeadDeleteData(Head);
            ShowList(Head);
            break;
        }
        case 6:
        {
            TailDeleteData(Head);
            ShowList(Head);
            break;
        }
        case 7:
        {
           printf("You choose to exit.\n");
           break;
        }
    }
    return 0;
}

结果图:

转载请注明作者:小刘

(续)顺序表之单循环链表(C语言实现),布布扣,bubuko.com

时间: 2024-10-30 01:41:20

(续)顺序表之单循环链表(C语言实现)的相关文章

顺序表与单链表的区别及优缺点

线性表之顺序表与单链表的区别及优缺点 尊重原创 -->原文链接 --> 侵权删 这里比较的是基于C语言实现的顺序表与单链表,与其他语言的实现可能会有差异,但我相信语言是相通的,它们的实现机制应该也差不多. 顺序表描述: 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤i≤n 其中,L是元素占用存储单元的长度. 单链表描述: 单链表

数据结构----顺序表与单链表(JAVA)

下面为学习顺序表和单链表的一些基本操作函数: 1 public class SeqList<T> extends Object { 2 protected int n; 3 protected Object[] element; 4 5 public SeqList(int length) { 6 this.element = new Object[length]; 7 this.n = 0; 8 } 9 10 public SeqList() { 11 this(64); 12 } 13 1

数据结构实验报告-实验一 顺序表、单链表基本操作的实现

实验一    顺序表.单链表基本操作的实现   l  实验目的 1.顺序表 (1)掌握线性表的基本运算. (2)掌握顺序存储的概念,学会对顺序存储数据结构进行操作. (3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能力. l  实验内容 1. 顺序表 1.编写线性表基本操作函数: (1)InitList(LIST *L,int ms)初始化线性表: (2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插入元素: (3)DeleteList1

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

顺序表与单链表

初学数据结构,对顺序表与单链表的概念与操作有点模模糊糊,为此特地查阅了资料,了解了不少,以下是对他们的总结: 顺序表内存中地址连续,长度不变更,支持随机查找,可以在时间复杂度O(1)内查找元素,适用于大量访问元素而少量增添或删除的程序.链表内存地址非连续,长度可以变化,算法时间复杂度为O(n),适用于需要进行大量增添或删除元素操作,而对访问无需求的程序. 下面来看看他们的基本操作(查找,删除,插入)的区别: 顺序表的查找: int GetElem(Seqlist L,int i,DateType

九、顺序表和单链表的对比分析

1.如何判断某个数据元素是否存在于线性表中? find()操作: 可以为线性表List增加一个查找操作 int find(const T& e)const; 参数:待查找的数据元素 返回值: 大于0:数据元素在线性表中第一次出现的位置 -1:数据元素不存在 针对基础数据类型,首先在顶层父类List中增加一个虚函数virtual int find(const T& e) const = 0;,然后在各子类中实现这个函数 // 顺序表中的实现 SeqList.h int find(const

数据结构复习---顺序表和单链表

1.前言: 最近比较浮躁,想学习一门新的技术却总是浅尝辄止,遇到不懂的地方就想跳过去,时间长了,心态就有点崩了.静下心来,去喝了几碗心灵鸡汤.鸡汤博主感动到了我:"无专注,无风景.不要太贪心,一次只做一件事,而且只做最重要的事.".于是乎,我把家里翻了个底朝天,找到了我垫在床底下的<数据结构>这本书,觉得自己是时候静下心来好好复习一下基础了.今天刚看到顺序表和链表,把我的学习心得记录在这里.也希望自己能坚持,老老实实的把这本书复习完. 2.数据结构的重要性: 讲一门知识之前

线性表的链式存储——顺序表和单链表的对比分析

1,线性表两种实现: 1,顺序表: 2,单链表: 2,问题: 1,如何判断某个数据元素是否存在线性表中? 1,遍历线性表: 2,封装这个遍历操作: 3,遗失的操作 - find: 1,可以为线性表(List)增加一个查找操作: 2,int find(const T& e) const; 1,参数: 1,待查找的数据元素: 2,返回值: 1,>= 0:数据元素在线性表中第一次出现的位置: 2,-1:数据元素不存在: 3,遍历中会有相等和不等操作符,当比较对象是类的时候,需要类继承自 Objec

数据结构之线性表(顺序表,单链表)——图书管理系统

顺序表: 代码如下: 1 #include<iostream> 2 #include<fstream> 3 #include<string> 4 #include<iomanip> 5 using namespace std; 6 #define OK 1 7 #define ERROR 0 8 #define OVERFLOW -2 9 typedef int Status; 10 typedef int ElemType; 11 12 #define M