数据结构之单链表基本操作——C语言

数据结构之单链表基本操作——C语言实现

初学数据结构,欢迎批评指正~

#include<stdio.h>
#include<stdlib.h>
#define NULL ((void *)0)
//链表数据结构(带有头结点)
//方法包括:链表的创建,增查删,求链表长度
typedef int ElemType;
//定义结构体
typedef struct node{
    ElemType data;
    struct node * next;
}Node,*linkList;

//链表的创建,尾插法添加初始数据。
linkList createList(int num){
    linkList tail,head,newNode=NULL;
    ElemType elem;
    head =(linkList)malloc(sizeof(Node));
    if(head == NULL){
        printf("内存申请失败,头结点创建不成功~");
        return NULL;
    }
    tail = head;
    head->next = NULL;
    //生成num个元素的链表
    for(int i = 0;i < num; i++){
        scanf("%d",&elem);
        getchar();
        newNode = (linkList)malloc(sizeof(Node));
        if(newNode == NULL){
            printf("内存申请失败,初始化新结点创建不成功~");
            return NULL;
        }
        newNode->data = elem;
        newNode->next = NULL;
        tail->next = newNode;
        tail = tail->next;
    }
    return head;
}

//链表显示
void showLinkList(linkList L){
    linkList temp=L->next;
    if(L == NULL){
        printf("链表不存在\n");
        exit(0);
    }
    while(temp != NULL){
        printf("%d ",temp->data);
        temp = temp->next;
    }
}

//求链表长度
int linkListLength(linkList L){
    linkList temp = L->next;
    int length = 0;
    while(temp != NULL){
        length++;
        temp = temp->next;
    }
    return length;
}

//在链表的第i个位置加一个元素elem,先找到第i-1个元素,然后进行添加操作
void addElement(linkList L,ElemType elem,int i){
    linkList newNode,temp = L;
    int index = 0;
    while(temp != NULL && index < i-1){
        temp = temp->next;
        index++;
    }
    if(temp == NULL || index > i-1){
        printf("添加元素失败\n");
        exit(0);
    }
    newNode = (linkList)malloc(sizeof(Node));
    if(newNode == NULL){
            printf("内存申请失败,新结点创建不成功\n");
            exit(0);
    }
    newNode->data = elem;
    newNode->next = temp->next;
    temp->next = newNode;
}

//在链表中查找第i个元素并取出
ElemType getElem(linkList L,int i){
    linkList temp = L->next;
    int index = 1;
    while(temp != NULL && index < i){
        temp = temp->next;
        index ++;
    }
    if(temp != NULL && index == i){
        return temp->data;
    }
    else{
        printf("索引位置不合法,查找失败\n");
        exit(0);
    }

}
//链表删除第i个元素,pre指向第i-1个元素,temp指向第i元素,对i进行删除。
void deleteElem(linkList L,int i){
    linkList temp;
    linkList pre = L;
    int index = 0;
    while(pre ->next != NULL&&index < i - 1 ){
        pre = pre->next;
        index++;
    }
    if(pre -> next == NULL || index > i - 1 ){
        printf("删除失败\n");
        exit(0);
    }
    temp = pre->next;
    pre->next = temp->next;
    free(temp);

}
int main()
{
    int length,index;//长度和索引位置
    ElemType elem;//待添加元素
    linkList L;
    //链表初始化创建
    do{
        printf("初始化链表长度为:(请输入一个大于0的整数)\n");
        scanf("%d",&length);
        getchar();
    }while(length <= 0);
    L = createList(length);
    printf("链表长度为%d\n",linkListLength(L));
    showLinkList(L);
    //检验插入功能
    printf("请输入要插入的元素与位置\n");
    scanf("%d %d",&elem,&index);
    getchar();//消除回车
    addElement(L,elem,index);
    showLinkList(L);
    //检验查找功能
    printf("请输入你想查看链表的第几个元素:\n");
    scanf("%d",&index);
    getchar();
    printf("%d\n",getElem(L,index));
    //检验删除功能
    printf("请输入你想删除链表中的第几个元素:\n");
    scanf("%d",&index);
    getchar();
    deleteElem(L,index);
    showLinkList(L);
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值