/*函数包括: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;
}
【数据结构C语言】线性表的链式表示和实现
最新推荐文章于 2022-09-21 22:42:42 发布