单循环链表和单链表的唯一区别在于单循环链表的最后一个节点的指针域指向第一个节点,
使得整个链表形成一个环.
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;
}
结果图:
转载请注明作者:小刘