单链表基本操作

最近在准备考研,专业课方面首先开始了数据结构的复习,用的严奶奶的书,看了单链表的一节后,觉得有必要将单链表的基本操作具体实现,便于加深理解。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

LinkList HeadCreatList(LinkList L1){     //带头结点的头插法建立链表
    LNode *s;
    int x;
    //L1=(LinkList)malloc(sizeof(LNode));//为头结点分配内存空间
    //if(L1==NULL)
    //printf("Memory application failed!\n");
    L1->next=NULL;                     //头指针始终指向头结点,初始化为空表
    printf("Please input the Elem : ");
    scanf("%d",&x);
    while(x!=999){                    //输入999时输入终止
        s=(LNode*)malloc(sizeof(LNode));//为新节点申请内存空间
        if(s==NULL)printf("Memory Application failed!\n");
        s->data=x;
        s->next=L1->next;
        L1->next=s;
        scanf("%d",&x);
        }
        return L1;                   //    返回头指针
    }
void Listprint(LinkList L1)
{
    LinkList r=L1->next;           //将头指针的指针域用r保存
    while(r!=NULL)                //依次打印链表中的元素
    {
    printf("%d ",r->data);
    r=r->next;
    }
    printf("\n");
}
LinkList TailCreatList(LinkList L2){   //尾插法建立单链表
    LNode *s;
    LinkList t;                       //t是尾指针,始终指向最后一个数据元素
    int x;
    //L2=(LinkList)malloc(sizeof(LNode));//为头结点分配内存空间
    //if(L2==NULL)
    //printf("Memory application failed!\n");
    L2->next=NULL;                      //初始化为空表
    t=L2;                              //初始化尾指针
    printf("Please input the Elem : ");
    scanf("%d",&x);
    while(x!=999){
        s=(LNode*)malloc(sizeof(LNode));
        if(s==NULL)printf("Memory Application failed!\n");
        s->data=x;
        t->next=s;
        t=s;                          //t始终指向最后一个节点
        scanf("%d",&x);
        }
        t->next=NULL;                //尾指针赋空值
        return L2;
    }
LinkList insertElem(LinkList L)
{
    LNode *s;
    int i;ElemType e;               //i为插入的位置,e为插入的元素
    LNode *prio=L;                  //prio为第i个结点的前驱
    int j=0;

    printf("you will insert e,please input the position and the e :");
    scanf("%d %d",&i,&e);
    s=(LNode *)malloc(sizeof(LNode));
    for(j=1;j<i;j++)               //寻找第i个结点的前驱结点
    {
        prio=prio->next;
    }
    s->data=e;                    //插入元素后相关指针做相应的修改
    s->next=prio->next;
    prio->next=s;

    return L;

}
LinkList deleteElem(LinkList L)
{
    LNode *q,*temp=L;
    int i;ElemType e;              //i为删除元素的位置,e为删除的元素返回值
    int j;

    printf("you will delete e,please input the position :");
    scanf("%d",&i);

    for(j=1;j<i;j++)             //寻找第i个结点
    {
        temp=temp->next;
    }
    e=temp->next->data;          //保存删除元素的数据区
    q=temp->next;                //删除后的指针修改
    temp->next=q->next;
    free(q);
    printf("%d has been deleted . \n",e);//删除元素回显
    return L;

}

int main()
{
   LinkList L1;

   HeadCreatList(L1);               //调用头插函数建立链表L1
   printf("Headinsert List is :");
   Listprint(L1);

   TailCreatList(L1);               //调用尾插函数重新建立链表L1
   printf("Tailinsert List is :");
   Listprint(L1);

   insertElem(L1);                //插入元素
   printf("After insertion,the list is:");
   Listprint(L1);

   deleteElem(L1);               //删除元素
   printf("After deletinon,the list is:");
   Listprint(L1);
    return 0;
}

运行结果:


从程序运行结果可以看出,利用尾插法建立的单链表输出的数据顺序和从键盘输入的数据顺序一致。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值