#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
/**
*@Name:线性表--循环单链表和基本操作
*@Description:循环单链表的创建,元素的查找、插入、删除和修改和移动。
*@Author:Freedoman
*@Date: 2014-8-6
*/
struct Node /*定义结点*/
{
int data; /*当前结点存储的数据*/
struct Node * next; /*指向下一个结点的指针*/
};
typedef struct Node * PNode;
/*函数声明*/
PNode createNullCirLinkedList();
int isNullCirLinkedList(PNode head);
int initializeCirLinkedList(PNode head);
int insertBeforeElement(PNode head);
int insertAfterElement(PNode head);
int deleteElement(PNode head);
int findBeforAfterNode(PNode head);
void printfCirLinkedList(PNode head);
/*-------创建带头结点的空循环链表---------*/
PNode createNullCirLinkedList(){
printf("创建带头结点的空循环链表\n");
PNode head = NULL;
head = (PNode) malloc(sizeof(Node));
if(head == NULL){
printf("创建失败!\n");
}else{
// 循环链表而非单链表
head->next = head;
head->data = -1;
printf("创建成功!\n");
}
return head;
}
/*----------判断当前循环链表是否为空------------*/
int isNullCirLinkedList(PNode head){
if(head->next == head){
printf("当前循环链表为空!\n");
return 1;
}
else{
printf("当前循环链表不为空!\n");
return 0;
}
}
/*----------根据输入的元素查找结点------------*/
PNode findNodeByEle(PNode head, int data){
PNode p = head;
if(!(isNullCirLinkedList(head))){
// 循环移动指针查找结点
while(p->next != head){
if(p->next->data != data){
p = p->next;
continue;
} else{
// 找到结点
return p->next;
}
}
printf("没有找到指定元素!\n");
}
return head;
}
/*---初始化当前循环链表,默认向结尾插入元素---*/
int initializeCirLinkedList(PNode head){
printf("初始化当前循环链表\n");
PNode p = head,temp;
int data,count = 0;
if(isNullCirLinkedList(head)){
while(1){
printf("请输入元素(-1结束)>>>");
scanf("%d",&data);
if( data != -1){
if(count++ == 0){
temp = (PNode)malloc(sizeof(Node));
temp->data = data;
temp->next = head;
head->next = temp;
}else{
temp = (PNode)malloc(sizeof(Node));
temp->data = data;
temp->next = head;
p->next->next = temp;
p = p->next;
}
}
else{
break;
}
}
printfCirLinkedList(head);
return 1;
}
printf("不能初始化!\n");
return 0;
}
/*-------在指定元素之前插入元素------------*/
int insertBeforeElement(PNode head){
printf("在指定元素之前插入元素\n");
int data,ele,i;
PNode p = head;
if(!isNullCirLinkedList(head)){
printf("请指定元素>>>");
scanf("%d",&data);
printf("请输入要插入的元素>>>");
scanf("%d",&ele);
// 循环移动指针定位元素
while(p->next != head){
if(p->next->data != data){
p = p->next;
continue;
}else{
// 插入元素
PNode temp = (PNode)malloc(sizeof(Node));
temp->data = ele;
temp->next = p->next;
p->next = temp;
printf("插入成功!\n");
printfCirLinkedList(head);
return 1;
}
}
printf("没有找到指定元素!\n");
}
return 0;
}
/*-------在指定元素之后插入元素------------*/
int insertAfterElement(PNode head){
printf("在指定元素之后插入元素\n");
int data,ele,i;
PNode p = head;
if(!isNullCirLinkedList(head)){
printf("请指定元素>>>");
scanf("%d",&data);
printf("请输入要插入的元素>>>");
scanf("%d",&ele);
// 循环移动指针查找元素
while(p->next != head){
if(p->next->data != data){
p = p->next;
continue;
}else{
// 插入指定元素
PNode temp = (PNode)malloc(sizeof(Node));
temp->data = ele;
temp->next = p->next->next;
p->next->next = temp;
printf("插入成功!\n");
printfCirLinkedList(head);
return 1;
}
}
printf("没有找到指定元素\n");
}
return 0;
}
/*--------------删除指定元素-------------*/
int deleteElement(PNode head){
printf("删除指定元素\n");
int data;
PNode p = head;
if(!isNullCirLinkedList(head)){
printf("请指定元素>>>");
scanf("%d",&data);
// 循环移动指针查找元素
while(p->next != head){
if(p->next->data != data){
p = p->next;
continue;
}else{
// 删除结点
p->next = p->next->next;
printf("删除成功!\n");
printfCirLinkedList(head);
return 1;
}
}
printf("没有找到指定元素!\n");
}
return 0;
}
/*------查找指定元素的前驱与后继结点------*/
int findBeforAfterNode(PNode head){
printf("查找指定元素的前驱与后继结点\n");
int data;
PNode p = head;
if(!isNullCirLinkedList(head)){
printf("请指定元素>>>");
scanf("%d",&data);
// 循环移动指针查找元素
while(p->next != head){
if(p->next->data != data){
p = p->next;
continue;
}else{
printf("前驱结点>>>>%d\n",p->data);
printf("后继结点>>>>%d\n",p->next->next->data);
return 1;
}
}
printf("没有找到指定元素!\n");
}
return 0;
}
/*-------打印当前循环链表-----------------*/
void printfCirLinkedList(PNode head){
PNode p = head;
printf("打印[");
do{
printf(" %d ",p->data);
p = p->next;
}while(p != head);
printf(" %d ",p->data);
printf("]\n");
}
int main(){
printf("\n---循环链表的基本操作---\n");
int input;
PNode head = NULL;
PNode q = NULL;
while(1){
printf("\n 1_创建带头结点的空循环链表\n 2_判断当前循环链表是否为空\n");
printf(" 3_初始化当前循环链表\n 4_在指定元素之前插入元素\n 5_在指定元素之后插入元素\n");
printf(" 6_删除指定元素\n 7_查找指定元素的前驱与后继结点\n");
printf("\n请选择>>>");
scanf("%d",&input);
switch(input){
case 1 :
head = createNullCirLinkedList();
break;
case 2 :
isNullCirLinkedList(head);
break;
case 3 :
initializeCirLinkedList(head);
break;
case 4 :
insertBeforeElement(head);
break;
case 5 :
insertAfterElement(head);
break;
case 6 :
deleteElement(head);
break;
case 7 :
findBeforAfterNode(head);
break;
case 8:
printfCirLinkedList(PNode head);
break;
default :
printf("输入有误!\n");
break;
}
}
return 0;
}
性线表----循环单链表的基本的操作
最新推荐文章于 2022-03-07 16:54:45 发布