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

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

/**
 *@Name:线性表--单链表
 *@Description:单链表的创建,元素的插入、删除和修改和移动。
 *@Author:Freedoman
 *@Date: 2014-8-5
 */

struct Node						/*结点类型*/
{
    int data;					/*数据域*/
    struct Node * next;		/*指针域*/
};

typedef struct Node * PNode;


/*函数声明*/
PNode createNullLinkedList();
int isNullLinkedList(PNode head);
PNode initializeLinkedList(PNode head);
int insertBeforeElement(PNode head);
int insertAfterElement(PNode head);
int deleteElement(PNode head);
void findBeforeAfterNode(PNode head);
void printLinkedList(PNode head);

/*------------创建带头结点的单链表----------*/
PNode createNullLinkedList(){
    printf("创建带头结点的单链表\n");
    PNode head = (PNode)malloc(sizeof(Node));
    if(head != NULL){
        head->data = -1;
        head->next = NULL;
        printf("创建成功!\n");
    }else{
        printf("创建失败!\n");
    }
    return head;
}

/*---------------判断当前链表是否为空--------------*/
int isNullLinkedList(PNode head){
    if(head->next == NULL){
        printf("当前链表为空!\n");
        return 1;
    }else{
        printf("当前链表不为空!\n");
        return 0;
    }
}

/*------初始化当前单链表,默认顺序插入若干元素--------*/
PNode initializeLinkedList(PNode head){
    printf("初始化当前链表\n");
    int data,count = 0;
    PNode p,temp;
    if(isNullLinkedList(head)){
        while(1){
            printf("请输入元素(-1结束)>>>");
            scanf("%d",&data);
            if(data == -1){
                break;
            }
            temp =(PNode)malloc(sizeof(struct Node));
            temp->data = data;
            temp->next=NULL;
            if(count++ == 0){
                head->next = temp;
                p = head;
            }else{
                p->next->next = temp;
                p = p->next;
            }
        }
        printLinkedList(head);
    }else{
        printf("不能初始化!\n");
    }
    return head;
}

/*---------------在指定元素之前插入元素------------------*/
int insertBeforeElemente(PNode head){
    printf("在指定元素之前插入元素\n");
    PNode p = head;
    int data;
    int ele;
    if(!isNullLinkedList(head)){
        printf("请指定元素>>>");
        scanf("%d",&ele);
        printf("请输入要插入的元素>>>");
        scanf("%d",&data);

        while(p->next != NULL){
            // 移动指针定位结点
            if(p->next->data != ele){
                p = p->next;
                continue;
            }
            // 插入
            PNode temp = (PNode)malloc(sizeof(Node));
            temp->data = data;
            temp->next = p ->next;
            p->next = temp;
            printf("插入成功\n");
            printLinkedList(head);
            return 1;
        }
        printf("没有找到指定元素!\n");
    }
    return 0;
}

/*---------------在指定元素之后插入元素------------------*/
int insertAfterElement(PNode head){
    printf("在指定元素之后插入元素\n");
    PNode p = head;
    int data,ele;
    if(!isNullLinkedList(head)){
        printf("请指定元素>>>");
        scanf("%d",&ele);
        printf("请输入要插入的元素>>>");
        scanf("%d",&data);

        while(p->next != NULL){
            // 移动指针定位结点
            if(p->next->data != ele){
                p = p->next;
                continue;
            }
            // 插入
            PNode temp = (PNode)malloc(sizeof(Node));
            temp->data = data;
            temp->next = p ->next->next;
            p->next->next = temp;
            printf("插入成功\n");
            printLinkedList(head);
            return 1;
        }
        printf("没有找到指定元素!\n");
    }
    return 0;
}

/*--------------删除指定元素----------------*/
int deleteElement(PNode head){
    printf("删除指定元素\n");
    int ele;
    PNode p = head;
    if(!isNullLinkedList(head)){
        printf("请指定元素:");
        scanf("%d",&ele);
        while(p->next != NULL){
            // 移动指针定位元素
            if(p->next->data != ele){
                p = p->next;
                continue;
            }
            // 删除
            p->next = p->next->next;
            printf("删除成功\n");
            printLinkedList(head);
            return 1;
        }
        printf("没有找到指定元素!\n");
    }
    return 0;
}
/*---------------求指定元素的前驱和后继结点------------*/
void findBeforeAfterNode(PNode head){
    printf("求指定结点的前驱结点结点\n");
    int ele,i,j;
    PNode p = head;
    if(!isNullLinkedList(head)){
        printf("请指定元素>>>");
        scanf("%d",&ele);
        while(p->next != NULL){
            // 移动指针定位元素
            if(p->next->data != ele){
                p = p->next;
                continue;
            }
            printf("前驱结点为>>>>%d\n" ,p->data);
            printf("后继结点为>>>>%d\n",p->next->next->data);
            break;
        }
    }
}

/*---------打印当前链表各元素----------*/
void printLinkedList(PNode head){
    PNode p = NULL;
    printf("打印[");
    for( p = head; p != NULL; p = p->next){
        printf(" %d ",p->data);
    }
    printf("]\n");
}

int main(){
    int input;
    PNode head = NULL;
    printf("\n\n--------单链表的基本操作---------\n\n");
    while(1){
        printf("\n 1_创建带头结点的单链表\n 2_判断当前链表是否为空\n 3_初始化当前链表\n");
        printf(" 4_在指定元素之前插入元素\n 5_在指定元素之后插入元素\n");
        printf(" 6_删除指定元素\n 7_求指定元素的前驱与后继结点\n 8_打印当前链表\n");
        printf("\n>>>请选择:");
        scanf("%d",&input);
        switch(input){
        case 1 :
            head = createNullLinkedList();
            break;
        case 2 :
            isNullLinkedList(head);
            break;
        case 3 :
            initializeLinkedList(head);
            break;
        case 4 :
            insertBeforeElemente(head);
            break;
        case 5 :
            insertAfterElement(head);
            break;
        case 6 :
            deleteElement(head);
            break;
        case 7 :
            findBeforeAfterNode(head);
            break;
        case 8 :
            printLinkedList(head);
            break;
        default:
            printf("输入错误!\n");
            break;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值