码迷,mamicode.com
首页 > 编程语言 > 详细

(续)顺序表之单循环链表(C语言实现)

时间:2017-05-14 21:46:46      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:结果   int   lin   scan   lag   技术分享   show   ==   back   

循环链表和单链表的唯一差别在于单循环链表的最后一个节点的指针域指向第一个节点,

使得整个链表形成一个.





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语言实现)

标签:结果   int   lin   scan   lag   技术分享   show   ==   back   

原文地址:http://www.cnblogs.com/slgkaifa/p/6853698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!