/*
LinkList *L定义了一个LinkList指针
LinkList *&L是指针的引用
*/
#include<stdio.h>
#include<malloc.h>
typedef char ListData; //定义线性表 char int等类型
typedef struct List
{
ListData data;
struct List *next;
}LinkList;
void CreateListB(LinkList *&L,ListData a[],int n)
{
LinkList *s;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;i<=n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList)); //头插法建表
s->data=a[i];
s->next=L->next;
L->next=s;
}
}
void CreateListA(LinkList *&L,ListData a[],int n) //首地址 线性表内容为a[] 数组内容 n 为线性表 长度
{
LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList)); //为结点 L 动态分配内存
r=L;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}//尾插法建表
void InitList(LinkList *&L) //初始化线性表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
void DestroyList(LinkList *&L) //销毁线性表
{
LinkList *p=L,*q=p->next;
while(q!=NULL)
{
free(p); //释放 p 指针指向的内存
p=q;
q=p->next;
}
free(p);
}
int ListEmpty(LinkList *L) //判断线性表是否为空
{
return (L->next==NULL);
}
int ListLength(LinkList *L) //求线性表的长度 返回
{
LinkList *p=L;
int n=0;
while(p->next!=NULL)
{
n++;p=p->next;
}
return (n);
}
void DispList(LinkList *L) //输出线性表内容
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
int getElem(LinkList *L,int i,ListData &e) // 线性表 第几个 线性表数据地址
{ //求线性表某个数据的元素值
int j=0;
LinkList *p=L;
while(j<i&&p!=NULL)
{
j++;p=p->next;
}
if(p==NULL)
return 0;
else
{
e=p->data; return 1;
}
}
int LocateElem(LinkList *L,ListData e) //按元素查找
{
LinkList *p=L->next;
int i=1;
while(p!=NULL&&p->data!=e)
{
p=p->next;i++;
}
if(p==NULL)return(0);
else return(i);
}
int ListInsert(LinkList *&L,int i,ListData e) //插入数据元素 位置 ,元素
{
int j=0;
LinkList *p=L,*s;
while(j<i-1&&p!=NULL) //while 循环找到元素的位置
{
j++;p=p->next;
}
if(p==NULL)
return 0;
else
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=e;s->next=p->next;p->next=s;
return 1;
}
}
int ListDelete(LinkList *&L,int i,ListData &e) //删除数据元素
{
int j=0;
LinkList *p=L,*q;
while(j<i-1&&p!=NULL)
{
j++; p=p->next;
}
if(p==NULL)
return 0;
else
{
q=p->next;
if(q==NULL)return 0;
e=q->data;
p->next=q->next;
free(q);
return 1;
}
}
int main()
{
ListData e ,a[5]={'a','b','c','d','e'};
LinkList *L;
InitList (L); //初始化线性表
CreateListA(L,&a[0],5); //把元素按顺序尾插法插入线性表中
printf("单链表为 ");
DispList(L); //输出元素
printf("该线性表的长度为 ");
printf("%d\n",ListLength(L)); //为何会出现 6
if(ListEmpty(L)) printf("该单链表为空。\n"); //判断是否为空
else printf("该单链表不为空。\n");
printf("该链表第4个元素为 ");
getElem(L,4,e); //把输出的对应的元素赋值给 e
printf("%c\n",e);
printf("该链表 b 为第 ");
printf("%d 个元素\n",LocateElem(L,'b')); //调用函数 输出b 的位置
printf("在第3个位置加上'f'后链表为:");
ListInsert(L,3,'f'); //插入元素
DispList(L);
printf("删除第4个元素"); //删除元素
ListDelete(L,4,e);
DispList(L);
DestroyList(L); //释放顺序表
while(1);
return 0;
}
数据结构中线性表的c语言代码实现
最新推荐文章于 2024-07-29 03:57:29 发布