美文网首页
单向链表

单向链表

作者: abb266389fd0 | 来源:发表于2016-07-26 11:54 被阅读71次
#include <stdio.h>

#include <stdlib.h>

struct node{
    
    int data;
    
    struct node *next;
    
}*head;

void setupNullList();//创建一个空链表

void insertTailList();//尾插链表

void insertHeadList();//头插链表

struct node *creatNode();//创建一个结点

void appendNode(struct node *n);//追加结点

void insertNode(struct node *n);//插入结点

void deleteNode();//删除结点

void updateNode();//修改结点

void reverseList();//链表逆序

void showList();//输出链表

int listType = 0;

int main(){
    setupNullList();
    system("clear");
    printf("\n1、头插链表\n\n2、尾插链表\n\n请选择:\n\n");
    int flag = 0;
    scanf("%d",&flag);
    switch(flag){
        case 1:{
            listType = 1;
            insertHeadList();
            break;
        }
        case 2:{
            listType = 2;
            insertTailList();
            break;
        }
        default:
            break;
    }
    showList();
    flag = 1;
    int flagExit = 0;
    while(flag){
        printf("\n1、追加结点\n\n2、插入结点\n\n3、删除结点\n\n4、修改结点\n\n5、链表逆序\n\n6、输出链表\n\n0、退出程序\n\n请选择:\n\n");
        scanf("%d",&flag);
        switch(flag){
            case 1:{
                struct node *n = creatNode();
                if(NULL != n){
                    appendNode(n);
                }
                break;
            }
            case 2:{
                struct node *n = creatNode();
                if(NULL != n){
                    insertNode(n);
                }
                break;
            }
            case 3:{
                deleteNode();
                break;
            }
            case 4:{
                updateNode();
                break;
            }
            case 5:{
                reverseList();
                break;
            }
            case 6:{
                showList();
                break;
            }
            case 0:{
                flagExit = 1;
                break;
            }
        }
        if(flagExit == 1) break;
    }
    return 0;
    
}
//创建一个空链表
void setupNullList(){
    head = (struct node *)malloc(sizeof(struct node));
    if(NULL == head){
        printf("链表创建失败!\n");
    }else{
        head->next = NULL;
        head->data = 0;
    }
}
//尾插链表
void insertTailList(){
    struct node *tail = NULL;//尾结点
    printf("\n请输入要创建的结点id,输入0结束\n\n");
    int number = 0;
    scanf("%d",&number);
    while(number != 0){
        struct node *n = (struct node *)malloc(sizeof(struct node));
        n->data = number;
        n->next = NULL;
        if(head->next == NULL){//第一个结点
            head->next = n;
        }else{
            tail->next = n;
        }
        tail = n;
        scanf("%d",&number);
    }
}
//头插链表
void insertHeadList(){
    printf("\n请输入要创建的结点id,输入0结束\n\n");
    int number = 0;
    scanf("%d",&number);
    while(0 != number){
        struct node *n = (struct node *)malloc(sizeof(struct node));
        n->data = number;
        n->next = head->next;
        head->next = n;
        scanf("%d",&number);
    }
}
//创建结点
struct node *creatNode(){
    struct node *n = (struct node *)malloc(sizeof(struct node));
    printf("请输入要创建的结点id\n\n");
    int number = 0;
    scanf("%d",&number);
    if(NULL != n){
        n->data = number;
        n->next = NULL;
    }
    return n;
}
//在表尾追加结点
void appendNode(struct node *n){
    struct node *p = head->next;
    while(NULL != p->next){
        p = p->next;
    }
    p->next = n;
}
//插入结点
void insertNode(struct node *n){
    struct node *before = head;
    struct node *p = head->next;
    while(NULL != p){
        if(listType == 1 && p->data < n->data){
            before->next = n;
            n->next = p;
            break;
        }else if(listType == 2 && p->data > n->data){
            before->next = n;
            n->next = p;
            break;
        }else{
            break;
        }
        before = p;
        p = p->next;
    }
    if(p == NULL){
        before->next = n;
    }
}
//删除节点
void deleteNode(){
    printf("\n请输入要删除的结点id\n\n");
    int number = 0;
    scanf("%d",&number);
    struct node *before = head;
    struct node *p = head->next;
    while(NULL != p){
        if(p->data == number){
            before->next = p->next;
            free(p);
            break;
        }
        before = p;
        p = p->next;
    }
}
//更新结点
void updateNode(){
    int oldNumber = 0;
    int newNumber = 0;
    printf("\n请输入要修改的结点id\n\n");
    scanf("%d",&oldNumber);
    printf("\n请输入新的结点id\n\n");
    scanf("%d",&newNumber);
    struct node *p = head->next;
    while(NULL != p){
        if(p->data == oldNumber){
            p->data = newNumber;
        }
        p = p->next;
    }
}
//链表逆序
void reverseList(){
    struct node *p = head->next;
    struct node *q = NULL;
    head->next = NULL;
    while(NULL != p){
        q = p->next;
        p->next = head->next;
        head->next = p;
        p = q;
    }
}
//输出链表
void showList(){
    system("clear");
    struct node *p = head->next;
    while(NULL != p){
        if(NULL != p->next){
            printf("%d -> ",p->data);
        }else{
            printf("%d\n",p->data);
        }
        p = p->next;
    }
}

相关文章

  • 8.单向链表SingleLinkList

    目录:1.单向链表的定义2.单向链表的图解3.单向链表定义操作4.单向链表的实现 1.单向链表的定义 2.单向链表...

  • 线性表-单向循环链表

    为了方便,本文介绍的单向循环链表不包含头节点 单向循环链表内容 单向循环链表的的定义 单向循环链表的创建 单向循环...

  • 10.单向循环链表SingleCycleLinkList

    目录:1.单向循环链表的定义2.单向循环链表的图解3.单向循环链表定义操作4.单向循环链表的实现 1.单向循环链表...

  • 数据结构与算法——线性表3

    线性表——单向循环链表 3、单向循环链表 在单向链表的基础上,单向链表的尾结点的Next指向链表的头部,就是为循环...

  • 04单向循环链表实现总结

    一、说说什么是单向循环链表? 人狠话不多. 上图. 单向循环链表就是这个样子!单向循环链表.png 与单向链表区别...

  • 数据结构基础--单向循环链表

    单向循环链表 单向循环链表是可循环的单链表,它与单链表的区别在于单向链表的最后一个元素的指针域为空,而单向循环链表...

  • 2019-12-04 Java-LinkedList源码解读

    @TOC 1、链表数据结构 链表分为单向链表和双向链表,他们的区别在于,单向链表只能单向寻址,而双向链表可以双向寻...

  • 数据结构与算法之循环链表(3.4)

    目录 单向循环链表双向循环链表约瑟夫问题如何发挥循环链表的最大威力? 一 单向循环链表 单向循环链表 - 只有一个...

  • day03-双向链表

    双向链表: 单向链表只能单向查找,双向链表可以双向查找。 啥是双向链表? 双向链表可以双向查数据,所以就不存在单向...

  • 链表

    一、单向链表 单向链表的普通实现 Java实现: Kotlin实现: 单向链表的递归实现 Java实现: 二、双向...

网友评论

      本文标题:单向链表

      本文链接:https://www.haomeiwen.com/subject/ujunjttx.html