单链表的一些操作

本文详细介绍了如何使用C语言实现链表的基本操作,包括初始化链表、尾插法和头插法创建链表、插入元素、删除元素、查找元素以及计算链表长度。
摘要由CSDN通过智能技术生成

#include<stdio.h>

#include<malloc.h>

typedef int DataType;

typedef struct Linknode{
    DataType data;
    struct Linknode* next;
}Linklist;
void * Initlist() {
    Linklist * head;//头结点
    head = (Linklist*)malloc(sizeof(Linklist));//申请一个结点空间
    head->next = NULL;//链表为空
    return head;
}
void Creatlist_H(Linklist* head, int n) {
    Linklist * s;
    int i;
    printf("请输入%d个整数:", n);
    for (i = 0; i < n; i++) {
        s= (Linklist*)malloc(sizeof(Linklist));//生成一个新结点
        scanf("%d",&s->data);//依次给新结点的数据域赋值
        s->next= head->next;//将新结点的指针域存放头结点的指针域
        head->next=s;//将新结点插入头结点的后面
    }
    printf("建立链表操作成功!");
}
void Displist(Linklist* head) {
    Linklist* p;
    p = head->next;//*p指针指向链表第一个结点
    while(p != NULL) {//当指针不为空的时候,为空说明指向了尾结点(最后一个数)
        printf("%5d", p->data);//依次读取链表里的值,存入数据域中
        p=p->next;//读完一个接着读下一个
    }
}
void InsElem(Linklist* head, int n, DataType x) {
    Linklist* s;
    int i=0;
    while(head->next!= NULL && i < n - 1) {   //定位插入结点的位置(移动head指针一直到找到下标为n-1的位置)
          head = head->next;//移动head指针
          i++;//每移动指针一次下标加一
    }
    if (head != NULL) {     //找到n-1位置的情况下,指针head不为空
        s = (Linklist*)malloc(sizeof(Linklist));//申请要插入的结点的内存空间
        s->data = x; //新结点的数据域为要插入的值
        s->next = head->next;//将新结点s的指针域与后面的结点相连
        head->next = s;//将head与新结点相连
        printf("插入成功!\n");
    }
    else
        printf("插入失败!\n");
}
int Length(Linklist* heat) {
    int i = 0;
    while(heat->next != NULL) {
        heat = heat->next;//结点依次往下
        i++;
    }
    return i;
}
void Locate(Linklist* head, DataType x) {
    Linklist* s;
    s = head->next;//首节点
    int j=1;
    while(s->data!=x&&s!=NULL){   //查找定位
        s = s->next;
        j++;
    }
    if (s!=NULL)
        printf("查找成功!位置在%d,值为%d\n", j,s->data);
    else
        printf("查找失败\n");
}
void GetElem(Linklist* head, int n) {
    Linklist* s;
    s = head->next;
    int j = 1;
    while (s!= NULL && j < n) {
          s = s->next;
          j++;
    }
    if (j == n)
        printf("查找成功!元素的位置为%d,值为%d", j, s->data);
}
void DelElem(Linklist* head,int n) {
    Linklist* s,*p;
    p=head;
    int j = 0;
    DataType x;
    while (p->next != NULL && j < n - 1) {
        p = p->next;
        j++;
    }
    if (p->next != NULL && j == n - 1) {
        s=p->next;
        x = s->data;
        p->next = s->next;
        free(s);
        printf("删除第%d位上的元素%d成功!", n, x);
    }
}
int main() {
    Linklist* head;
    DataType x;
    int n;
    //初始化Initlist()
    head = Initlist();
    printf("请输入要建立线性表的长度:");
    scanf("%d", &n);
                              //建立单链表(尾插法)Creatlist_L(Linklist *head,int n)
                              //(头插法)Creatlist_H(Linklist *head,int n)
    Creatlist_H(head, n);    
    Displist(head);        //显示链表Displist(Linklist *head)
                              //插入结点InsElem(Linklist *head,int n,DataType x)
    printf("\n请输入要插入的位置:");
    scanf("%d", &n);
    printf("请输入要插入的值:");
    scanf("%d", &x);
    InsElem(head, n, x);
                             //显示插入后的表
    Displist(head);    
    Length(head);       //算链表的长Length(Linklist *heat)
                              //查找(按值)Locate(Linklist *head,DataType x)
    printf("\n请输入要查找的值:");
    scanf("%d", &x);
    Locate(head, x);
                              //查找(按序号)GetElem(Linklist *head,int n,DataType x)
    printf("\n请输入要查找数的位置:");
    scanf("%d", &n);
    GetElem(head, n);
                              //删除链表里的元素DelElem(Linklist *head,int n,DataType x)
    printf("\n请输入要删除元素的位置:");
    scanf("%d", &n);
    DelElem(head, n);
    Displist(head);//删除后的链表


}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值