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

原创 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;
}

相关文章推荐

算法与数据结构-循环单链表

  • 2013年12月02日 13:48
  • 3KB
  • 下载

数据结构与算法(单循环链表_约瑟夫问题)

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41...

C++数据结构与算法——单向循环链表

单向循环链表:相对于单向链表的最后一个节点的next指针指向nullptr,单向循环链表的最后一个节点的next指针指向链表头。此处主要实现了单向循环链表的插入、删除、构造、析构、输出操作符等简单功能...

数据结构与算法(C语言版)__循环链表

单向循环链表 带有表头结构的循环链表 链表的最后一个节点指向第一个节点 第一个节点是表头结构,不保存数据的。做链表有两种做法,一种是带有表头结构,一种是不带表头结构的,那么循环链表就是使用带表头...

数据结构高分笔记 算法2-18~2-19:双向循环链表

http://codeup.cn/problem.php?cid=100000660&pid=9 题目描述 双向链表是在结点中既保存了后一个结点指针又保存了前一个结点指针的链表。这种链表较单向链表...

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

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

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

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

线性表12|循环链表 – 数据结构和算法17

线性表12:循环链表   让编程改变世界 Change the world by program   循环,顾名思义就是:绕。   打个比方,就是从前山上有座庙,庙里有个老和尚和一个...

算法与数据结构之三----循环链表

/**************************************************************** 文件内容:线性表之循环链表操作 版本V1.0 说明:单链表必需...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构与算法—循环链表
举报原因:
原因补充:

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