数据结构-单链表的基本操作

数据结构,单链表的基本操作

#define _CRT_SECURE_NO_DEPRECATE
#include<stdbool.h>
#include<stdio.h>
#include<stdlib.h>

#define ture 1
/*
尾插法有点小问题,遍历输出的时候会在输出完中断程序,但是显示的尾插法没问题
*/
typedef struct LNode {
    int data;
    struct LNode * next;
}LNode,*LinkList;

//头插法建立单链表
LinkList List_HeadInsert(LinkList &L) {
    int x;
    LNode *s;
    L = (LinkList)malloc(sizeof(LinkList));//为L申请空间
    L->next = NULL;//防止脏数据
    printf("请输入要插入的数,输入999结束\n");
    scanf("%d", &x);
    while (x!=999)
    {
        s = (LNode*)malloc(sizeof(LNode));//为S申请空间
        s->data = x;//s的数据域为x
        s->next = L->next;
        L->next = s;
        printf("请输入要插入的数,输入999结束\n");
        scanf("%d", &x);

    }
    return L;
}



//尾插法建立单链表
LinkList List_TailInsert(LinkList &L) {
    int x;
    LNode *s,*r;
    L = (LinkList)malloc(sizeof(LinkList));//为L申请空间
    s = r = L;
    printf("请输入要插入的数,输入999结束\n");
    scanf("%d", &x);
    while (x != 999)
    {
        s = (LNode*)malloc(sizeof(LNode));//为S申请空间
        s->data = x;//s的数据域为x
        r->next = s;
        r = s;
        printf("请输入要插入的数,输入999结束\n");
        scanf("%d", &x);
    }
    return L;
}

//按位查找
LNode *GetElem(LinkList L, int i) {
    if (L == NULL)
        return false;
    int j=0;
    LNode *p;
    p = L;
    while (p != NULL && j<i)
    {
        p = p->next;
        j++;
    }
    return p;
}

//创建一个空的单链表
bool InitList(LinkList &L){
    L = (LNode*)malloc(sizeof(LNode));
    if (L == NULL)
        return false;
    L->next = NULL;
    return ture;
}

//按位插入
bool  listInsert(LinkList &L,int i,int e) {
    if(i<1)//判断输入是否合法
        return false;
    LNode *p;
    int j = 0;
    p=GetElem(L, i - 1);//按位查找
    if (p == NULL)
        return false;


    LNode *s = (LNode *)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;

    return ture;
}


//遍历单链表
void showList(LinkList L) {
    //pH->data                // 头节点数据,不是链表的常规数据,不要算进去了
    LNode *p = L;        // 头指针后面是头节点

    printf("-----------开始遍历-----------\n");
    while (NULL != p->next)        // 是不是最后一个节点
    {
        p = p->next;                // 走到下一个节点,也就是循环增量
        printf("node data: %d.\n", p->data);
    }

    printf("-------------完了-------------\n");

    /*LNode *p;
    p = L;

    printf("--------------开始遍历-----------\n");
    while (p->next!=NULL)
    {
        p = p->next;
        printf("%d\t", p->data);
        
    }
    printf("\n");
    printf("-------------遍历结束-------------\n");*/

}


int main() {
    LinkList L;
    LNode *p;
    int g = 0;
    int n = -1;
    InitList(L);
    listInsert(L, 1, 1);
    listInsert(L, 2, 2);
    listInsert(L, 3, 3);
    
    while (g != -1)
    {
        printf("请选择功能:\n");
        printf("1、头插法创建链表\n");
        printf("2、尾插法创建链表\n");
        printf("3、按位查找\n");
        printf("4、删除\n");
        printf("输入 -1 退出操作\n");
        printf("请输入:");
        scanf("%d", &g);

        printf("\n");

        if (g == 1) {
            List_HeadInsert(L);
            printf("使用头插法创建的单链表为:\n");
            showList(L);
        }
        else if (g==2)
        {
            List_TailInsert(L);
            printf("使用尾插法创建的单链表为:\n");
            showList(L);
        }
        else if (g == 3)
        {
            printf("请输入需要查找第几位:");
            scanf("%d", &n);
            p=GetElem(L, n);
            if (p == NULL) 
                printf("查找的数据有误,请重新输入");
            printf("第%d的数为:\t%d\n",n,p->data);
        }

        

    }

    


    

    

    
    
}

 

posted @ 2022-07-03 22:56  yasai  阅读(42)  评论(0编辑  收藏  举报