数据结构与算法—循环链表

原创 2015年07月08日 11:14:01
/*
功能:循环链表的操作:初始化、插入(尾插法)、删除等
时间:2015-07-08
人员:西瓜太郎
*/

#include <stdlib.h>
#include <stdio.h>

#define ElementType int

struct Node;
typedef struct Node *PtrNode;
typedef PtrNode List;

typedef struct Node
{
    ElementType data;
    struct Node *next;

}Node;
void printCirList(List L)
{
    List temp;
    for(temp = L; temp->next != L; temp = temp->next)
        printf("  %d",temp->data);
    printf("  %d\n",temp->data);
}
void InitCirList(List *list)//尾插法
{

    ElementType itemValue;
    List tempCirList,temp;
    printf("输入结点的值,0表示结束:\n");
    while(1)
    {

        scanf("%d",&itemValue);
    //    fflush(stdin);

        if( itemValue == 0)
            return;
        if((*list) == NULL)//只有一个结点
        {
            *list = malloc(sizeof(struct Node));
            if(!(*list))
                exit(EXIT_FAILURE);
            (*list)->data = itemValue;
            (*list)->next = (*list);
        }
        else
        {
            for(tempCirList = (*list); tempCirList->next != (*list); tempCirList=tempCirList->next)
                ;
            temp = malloc(sizeof(struct Node));

            temp->data = itemValue;

            tempCirList->next = temp;

            temp->next = (*list);

        }
    }
}
int CirListLength(List L)
{
    List temp;
    int sum = 1;
    for(temp = L; temp->next != L; temp=temp->next)
        sum++;
    return sum;
}
List FindPreCirList(List L, int insertPosit)
{
    List temp=NULL;
    int i=1;
    if(insertPosit <1 || insertPosit > CirListLength(L))
    {
        printf("\n插入/删除的位置越界!!!\n");
        return temp;
    }
    temp = L;
    while( (i + 1)<insertPosit )
    {
        temp =temp->next;
        i++;
    }
    return temp;

}
//【特么的关键:2015-07-08
//一定要传*L进来才能在插入第一个位置的时候,改变头指针的地址】
int insertCirList(List *L, int insertPosition, ElementType insertValue)
{
    List PreList,temp,target;

    if(insertPosition == 1)//插入的是第一个结点
    {
        for(target = *L; target->next != *L; target = target->next)
            ;

        temp = malloc(sizeof(struct Node));
        temp->data = insertValue;

        target->next = temp;
        temp->next = *L;
        *L = temp;
        return 1;
    }

    PreList = FindPreCirList(*L,insertPosition);
    if(!PreList)
        return 0;
    temp = malloc(sizeof(struct Node));
    temp->data = insertValue;

    temp->next = PreList->next;
    PreList->next = temp;
    return 1;


}

int deleteCirList(List *L, int deletePosition)
{
    List temp,target;
    if(deletePosition == 1)
    {
        for(target = *L; target->next != *L; target = target ->next)
            ;
        temp = *L;

        target->next = (*L)->next;
        (*L) = (*L)->next;

        free(temp);
        return 1;
    }

    target = FindPreCirList(*L, deletePosition);
    if(!target)
        return 0;
    temp = target->next;
    target->next = temp->next;
    free(temp);
    return 1;

}
int main()
{
    unsigned int item;
    int insertPosition,deletePosition;
    ElementType insertValue;


      //【特么关键:2015-07-07
    //注意一定要初始化为空,因为后面建立链表的第一个结点的时候有用到!!!】
    List L = NULL;

    printf("1.初始化链表\n");
    printf("2.插入结点\n");
    printf("3.删除结点\n");
    printf("4.返回结点位置\n");
    printf("5.遍历列表\n");
    printf("0.退出\n");



    while(1)
    {
        printf("请选择你的操作:");
        scanf("%d",&item);
        switch(item)
        {
        case 1:
            InitCirList(&L);
            printCirList(L);
            break;
        case 2:
            while(1)
            {
                printf("输入需要插入的位置:");
                scanf("%d",&insertPosition);
                printf("输入需要插入的值:");
                scanf("%d",&insertValue);
                if(!insertCirList(&L,insertPosition,insertValue))
                    continue;
                printCirList(L);
                break;
            }
            break;
        case 3:
            while(1)
            {
                printf("输入要删除的结点位置:");
                scanf("%d",&deletePosition);
                if(!deleteCirList(&L,deletePosition))
                    continue;
                printCirList(L);
                break;
            }

            break;
        case 4:
            break;
        case 5:
            break;
        case 0:
            return 0;
            break;
        default:
            break;

        }
    }

    return 0;
}

数据结构(9)线性表之循环链表介绍

导言 循环列表 循环列表结构 单循环列表实现代码 运行结果导言循环列表是链式存储结构的一种形式。它的特点从名字就可以清楚,“循环”。那么如何实现循环。 循环的实现很简单,只有表的最后一个结点的指针,...
  • YuYunTan
  • YuYunTan
  • 2016年03月16日 11:25
  • 1908

数据结构学习之循环链表结构

注:本文的主要目的是为了记录自己的学习过程,也方便与大家做交流。转载请注明来自: http://blog.csdn.net/ab198604         循环链表在单向链表及双向链表的...
  • ab198604
  • ab198604
  • 2013年01月04日 17:55
  • 5474

数据结构——循环单链表和双向链表

1.循环单链表 1.循环单链表特点: 链表中最后一个结点的指针域不再是结束标志,而是指向整个链表的第一个结点,从而使链表形成一个环。和单链表相同,循环单链表也有带头结点和不带头结点两种。带头结点的...
  • xiaofei__
  • xiaofei__
  • 2016年03月25日 21:57
  • 2372

【数据结构】顺序表、单链表、循环链表的插入与删除

写在前面的 顺序表 插入 删除 定位 单链表 插入 删除 双向循环链表 删除 插入 总结写在前面的       在复习数据结构的过程中对于链表的操作总是容易忘记,时不时的就不知道具体的该怎么操作了,所...
  • SugaryoTT
  • SugaryoTT
  • 2016年09月19日 23:05
  • 1291

C语言实现数据结构中的循环链表

C语言实现数据结构中的循环链表# include # include typedef struct node  //定义链表中结点的结构{ int code;  struct node *next;}...
  • fullbug
  • fullbug
  • 2007年04月18日 23:41
  • 2543

数据结构之自建算法库——循环单链表

本文针对数据结构基础系列网络课程(2):线性表中第13课时双链表。按照“0207将算法变程序”[视频]部分建议的方法,建设自己的专业基础设施算法库。双链表算法库算法库采用程序的多文件组织形式,包括两个...
  • sxhelijian
  • sxhelijian
  • 2015年09月12日 06:55
  • 1964

数据结构之---c语言实现循环单链表操作

数据结构之---c语言实现循环单链表操作
  • u012965373
  • u012965373
  • 2015年05月15日 16:49
  • 1576

数据结构与算法——线性表链式存储(单循环链表)

今天总结循环单链表 什么是单循环链表? 单链表终端结点的指针域是指向空的,如果将其指向头结点,这样就形成了一个环,那么这种首尾相接的环就够成了单循环链表. 单链表中我们都是用头指针来表示的,但是...
  • hsk256
  • hsk256
  • 2015年05月07日 11:04
  • 1727

数据结构——线性表 (顺序表、单链表、静态链表、循环链表、双向链表)

线性表 ---顺序存储结构 ---链式存储结构(单链表、静态链表、循环链表、双向链表)...
  • daijin888888
  • daijin888888
  • 2017年04月12日 16:06
  • 1937

数据结构之俩循环单链表合并

这段时间要好好调整一下自己了,发现基础才是王道,所以打算好好铺一铺我滴c指针这一块了,所以数据结构将会断更一段时间,不过接下来要和大家见面的就是我们上次的循环单链表之合并 题目:将链表a和链表b合并...
  • Mikeoperfect
  • Mikeoperfect
  • 2017年05月14日 22:25
  • 696
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构与算法—循环链表
举报原因:
原因补充:

(最多只允许输入30个字)