性线表----循环单链表的基本的操作

#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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值