首页 > 代码库 > (续)顺序表之单循环链表(C语言实现)
(续)顺序表之单循环链表(C语言实现)
单循环链表和单链表的唯一区别在于单循环链表的最后一个节点的指针域指向第一个节点,
使得整个链表形成一个环.
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; }结果图:
转载请注明作者:小刘
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。