【数据结构C语言】线性表的链式表示和实现

/*函数包括:1.初始化 2.取值 3.查找 4.插入 5.删除 6.建表 7.遍历 8.求长度 9.倒置*/


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




typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;




//1.初始化
void InitList(LinkList &L)
{
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
}




//2.取值
void GetElem(LinkList L,int i,int *e)
{
LNode *p=NULL;//p是指向LNode类型的指针变量
p=L->next;int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if (!p||j>i) printf("i值不合法");
*e=p->data;
}




//3.查找
/*这是课本上的函数
LNode *LocateElem(LinkList L,int e)
{
LNode *p=NULL;
p=L->next;
while(p&&p->data!=e)
p=p->next;
return p;
}
*/
/*课本上是返回地址,然而我认为返回地址并没卵用,所以我不用课本给的函数,用返回值为e的位次的函数*/
int LocateElem(LinkList L,int e)
{
    LNode *p=NULL;
    p=L->next;
    int i=1;
    while(p&&p->data!=e)
    {
        p=p->next;
        i++;
    }
    return i;
}




//4.1插入(插在前面,课本上的)
void ListInsert_H(LinkList &L,int i,int e)
{
LNode *p=NULL,*s=NULL;
p=L;int j=0;
while(p&&(j<i-1))
{p=p->next;j++;}
    s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
//4.2插在后面(补充)
void ListInsert_R(LinkList &L,int i,int e)
{
LNode *p=NULL,*s=NULL;
p=L;int j=0;
while(p&&(j<i))
{p=p->next;j++;}
    s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}


//5.删除
void ListDelete(LinkList &L,int i)
{
LNode *p=NULL,*q=NULL;
p=L;
int j=0;
while(p->next&&(j<i-1))
{p=p->next;++j;}
if(!(p->next)||(j>i-1)) printf("删除位置不正确");
    q=p->next;
p->next=q->next;
free(q);
}




//6.1前插法创建单链表
void CreatList_H(LinkList &L,int n)
{
int e;
LNode *p=NULL;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
printf("请输入%d个数,前插法建立单链表",n);
for(int i=0;i<n;i++)
{
scanf("%d",&e);
p=(LNode *)malloc(sizeof(LNode));
p->data=e;
p->next=L->next;
L->next=p;
}
}




//6.2后插法建立单链表
void CreatList_R(LinkList &L,int n)
{
int e;
LNode *p=NULL,*r=NULL;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
r=L;
printf("请输入%d个数,后插法建立单链表",n);
for(int i=0;i<n;i++)
{
scanf("%d",&e);
p=(LNode *)malloc(sizeof(LNode));
p->data=e;
p->next=NULL;
r->next=p;
r=p;
}
}




//补充7.遍历
void ListPrint(LinkList L)
{
LNode *p=L->next;
while(p!=NULL)
{printf("%d ",p->data);p=p->next;}
}




//补充8.求长度
int ListLength(LinkList L)
{
    LNode *p=NULL;
    p=L->next;
    int i=0;
    while(p)
    {
        p=p->next;
        i++;
    }
    return i;
}




//补充9.倒置
void ListInvert(LinkList &L)
{
    LNode *p,*q;
    p=L->next;
    L->next=NULL;
    while(p)
    {
        q=p;
        p=p->next;
        q->next=L->next;
        L->next=q;
    }
}








int main()
{
    int i,x,e;
    LinkList L;
    CreatList_R(L,5);


    printf("当前链表是:");
    ListPrint(L);


    printf("\n\n倒置后的链表是:");
    ListInvert(L);
    ListPrint(L);


    printf("\n\n请输入要取的元素的位置i:");
    scanf("%d",&i);
    GetElem(L,i,&x);
    printf("第%d个元素的值是%d\n",i,x);


    printf("\n请输入要查找的元素的值e:");
    scanf("%d",&e);
    printf("%d是第%d个元素",e,LocateElem(L,e));


    printf("\n\n请输入要插入元素的位置和数值:");
    scanf("%d %d",&i,&e);
    ListInsert_H(L,i,e);
    printf("现在的链表是:");
    ListPrint(L);


    printf("\n\n请输入要删除的元素的位置i:");
    scanf("%d",&i);
    ListDelete(L,i);
    printf("现在的顺序表是:");
    ListPrint(L);


    printf("\n\n现在的长度是:%d",ListLength(L));


    return 0;
}




























 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值