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

来源:互联网 发布:天敏网络机顶盒root 编辑:程序博客网 时间:2024/05/17 01:41
#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 0