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

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

使得整个链表形成一个环.

C实现代码例如以下:

#include

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

{

pHead=(Node *)malloc(sizeof(Node));

printf("Please input the %dst node data:

",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:

");

while(TempNode->next!=Head->next)

{

printf("%d ",TempNode->data);

TempNode=TempNode->next;

}

printf("%d",TempNode->data);

printf("

");

}

//输出链表某个值的位置

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:

");

scanf("%d",&number);

Head=InitList(number);

printf("The initital list is:

");

ShowList(Head);

int flag;

printf("

");

printf("**********************Your Choice********************

");

printf("****************1-输出链表某个值的位置***************

");

printf("****************2-输出链表某个位置的值***************

");

printf("****************3-头入法插入元素*********************

");

printf("****************4-尾入法插入元素*********************

");

printf("****************5-删除头结点*************************

");

printf("****************6-删除尾结点*************************

");

printf("****************0-退出*******************************

");

printf("

");

printf("Please input flag:

");

scanf("%d",&flag);

switch(flag)

{

case 1:

{

int data;

printf("Please input the data you want locate:

");

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:

");

scanf("%d",&location);

int data;

data=ListData(Head,location,number);

printf("The location's data is: %d

",data);

break;

}

case 3:

{

int data;

printf("Please input the data you want insert in head:

");

scanf("%d",&data);

HeadInsertData(Head,data);

ShowList(Head);

break;

}

case 4:

{

int data;

printf("Please input the data you want insert in tail:

");

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.

");

break;

}

}

return 0;

}结果图:

702ca4e1279c59f6a784632d55ac8f2f.bmp

转载请注明作者:小刘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值