PTA数据结构之 单链表的基本运算

实现单链表的基本运算:初始化、插入、删除、求表的长度、判空、释放。
(1)初始化单链表L,输出L->next的值;
(2)依次采用尾插法插入元素:输入分两行数据,第一行是尾插法需要插入的字符数据的个数,第二行是具体插入的字符数据。
(3)输出单链表L;
(4)输出单链表L的长度;
(5)判断单链表L是否为空;
(6)输出单链表L的第3个元素;
(7)输出元素a的位置;
(8)在第4个元素位置上插入‘x’元素;
(9)输出单链表L;
(10)删除L的第3个元素;
(11)输出单链表L;
(12)释放单链表L。


输入格式:


两行数据,第一行是尾插法需要插入的字符数据的个数,第二行是具体插入的字符数据。


输出格式:

按照题目要求输出


输入样例:

5
a b c d e


输出样例:

0
a b c d e
5
no
c
1
a b c x d e
a b x d e



代码实现:


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define INFEASIBLE -1
//链表定义
typedef char ElemType;//假设线性表中元素为整形
typedef int Status;//返回状态

typedef struct LNode
{
    ElemType data;
    struct LNode *next;

}LNode,*LinkList;
//函数定义
Status ListCreat_L(LinkList &L);//初始化
Status ListInsert_L(LinkList &L,int n);//插入
Status ListInserte_L(LinkList &L,int n,ElemType e);//插入元素
Status ListDelete_i_L(LinkList &L,int pos);//删除第pos
Status ListPrintf_L(LinkList &L);//输出单链表
Status ListPrintf_pos_L(LinkList &L,int pos);//输出单链表某一位置的值
Status ListPrintf_ElemType_L(LinkList &L,ElemType e );//输出e的位置,
int main()
{
    int n,L_length;
    char s;
    LinkList L;
    scanf("%d",&n);
    L_length=n;
    ListCreat_L(L);//初始化输出L->next的值
    printf("0\n");
    ListInsert_L(L,n);//插入
    ListPrintf_L(L);//输出单链表
    printf("\n");
    printf("%d\n",L_length);//输出单链表的长度
    if(L==NULL)//判断是否为空,是为yes,否为no
    {
        printf("yes\n");
    }
    else
    {
        printf("no\n");
    }
    ListPrintf_pos_L(L,3);//输出第3个元素
    ListPrintf_ElemType_L(L,'a');//输出a的位置
    ListInserte_L(L,4,'x');//插入x
    ListPrintf_L(L);//
    printf("\n");
    ListDelete_i_L(L,3);//删除第3个元素
    ListPrintf_L(L);
    //释放
    free(L);
}
Status ListCreat_L(LinkList &L)//初始化
{
    //开辟空间
    L=(LNode *)malloc(sizeof(LNode));
    if(!L) exit(OVERFLOW);
    L->next=NULL;
    return OK;
}
   Status ListInsert_L(LinkList &L,int n)//插入
{
    LNode *p=L,*q;

    for(int i=0;i<n;i++)
    {
        q=(LNode *)malloc(sizeof(LNode));
        if(!q) exit(OVERFLOW);
        scanf("%s",&q->data);
        p->next=q;
        p=p->next;
    }
    p->next=NULL;
}
Status ListInserte_L(LinkList &L,int n,ElemType e)//插入元素
{//寻找第n-1个位置
   LNode *p=L,*q,*curPtr;
   curPtr=(LNode *)malloc(sizeof(LNode));
   if(!curPtr) exit(OVERFLOW);
   curPtr->data=e;
   int i=1;
   if(n<0) return ERROR;
   while(p->next!= NULL)
   {
       if(p->next==NULL&&n>i)
       {
            p->next=curPtr;
           curPtr->next=NULL;
       }
       if(n==i)
       {
           q=p->next;
           p->next=curPtr;
           curPtr->next=q;
       }
       p=p->next;
       i++;
   }

}
Status ListDelete_i_L(LinkList &L,int pos)//删除第pos
{
    int i=1;
    LNode *p=L;
    LNode *q;
    if(pos<0) return ERROR;
    while(p->next!=NULL)
    {
        if(i==pos)
        {
            q=p->next;
            p->next=q->next;
            free(q);
        }
        i++;
        p=p->next;
    }
    if(pos>=i) return ERROR;
}
Status ListPrintf_L(LinkList &L)//输出单链表
{
    LNode *p=L->next;
    int i=0;
    if(p->next==NULL) printf("NULL");
    while(p)
    {
        if(i==0)
        {
            printf("%c",p->data);

        }
        else
        {
            printf(" %c",p->data);
        }
        i++;
        p=p->next;
    }
    return OK;

}
Status ListPrintf_pos_L(LinkList &L,int pos)//定位,输出单链表某一位置的值
{
    int i=1;
    LNode *p=L->next;
    if(pos<0) return ERROR;
    while(p)
    {
        if(i==pos)
        {
            printf("%c\n",p->data);
        }

        i++;
        p=p->next;
    }
    if(pos>=i) return ERROR;
}
Status ListPrintf_ElemType_L(LinkList &L,ElemType e)//输出e的位置,
{
    int i=1,m=0;
    LNode *p=L->next;
     while(p)
    {
        if(p->data==e)
        {
            printf("%d\n",i);
            m=1;
            break;
        }

        i++;
        p=p->next;
    }
    if(m==0) return ERROR;
}





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值