单链表的实现
怎么把main()函数和前面的联系起来,实现这些功能#include<stdio.h>
#include<stdlib.h>
typedef struct lnode
{
int data;
struct lnode *next;
}list,*List;
void create_list(list *&l,int a[],int n)//创建链表
{
int i=0;
list*s,*r;
l=(list *)malloc(sizeof(lnode));//创建头结点
r=l; //r始终指向结尾点,初始时指向头结点
for(i=0;i<n;i++) //循环建立数据结点
{
s=(list *)malloc(sizeof(lnode));
s->data=a; //创建数据结点s
r->next=s;
r=s;
}
r->next=NULL; //尾结点的next域置为NULL
printf("创建的链表为:\n",l->next);
}
void destroy_list(list *&l)//销毁链表
{
list *pre=l,*p=l->next; //pre指向结点p的前驱结点
while(p!=NULL)//扫描单链表l
{
free(pre);//释放pre结点
pre=p; //p,pre同步后移一个结点
p=pre->next;
}
free(pre);//循环结束时p为NULL,pre指向尾结点并释放
}
bool list_empty(list *l)//判断线性表是否为空表
{
return(l->next==NULL);
}
int list_length(list *l)//求线性表的长度
{
int n=0;
list *p=l;//p指向头结点,头结点的序号为0
while(p->next)
{
n++;
p=p->next;
}
return (n);//循环结束,p指向尾结点,其序号n为结点个数
}
void print_list(list *l)//输出链表
{
list *p=l->next;//p指向第一个结点
while(p!=NULL)//p不为NULL,输出p的结点的data域
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
bool get_list(list *l,int i,int &e)//求线性表中的某个数据的元素值
{
int j=0;
list *p=l;//p指向头结点,头结点的序号为0
if(i<=0)
return false;//i错误返回假
while(j<i&&p!=NULL)//找第i个结点p
{
j++;
p=p->next;
}
if(p==NULL)//不存在第i个结点,返回false
return false;
else//存在第i个结点,返回true
{
e=p->data;
return true;
}
}
int find_list(list *l,int e)//按元素值查找
{
int i=1;
list *p=l->next;//p指向首结点,使首结点的序号为1
while(p!=NULL&&p->data!=e)//查找data的值为e的结点,其序号为i
{
p=p->next;
i++;
}
if(p==NULL)//不存在值为e的结点,返回0
return (0);
else//存在值为e的结点,返回序号i
return (i);
}
bool insert_list(list *&l,int i,int e)//插入数据元素
{
int j=0;
list *p=l,*s;//p指向头结点,j为0,即头结点的序号为0
if(i<=0)
return false;//i错误返回false
while(j<i-1&&p!=NULL)//查找第i-1个结点p
{
j++;
p=p->next;
}
if(p==NULL)//未找到第i-1个结点,返回false
return false;
else//找到第i-1个结点p,插入新的结点并返回true
{
s=(list *)malloc(sizeof(lnode));
s->data=e;//创建新的结点s,其data域为e
s->next=p->next;//将结点s插入到结点p之后
p->next=s;
return true;
}
}
bool delete_list(list *&l,int i,int &e)//删除数据元素
{
int j=0;
list *p=l,*q;//p指向头结点,j=0,头结点的序号为0
if(i<=0)
return false;//错误返回false
while(j<i-1&&p!=NULL)//查找第i-1个结点
{
j++;
p=p->next;
}
if(p==NULL)//未找到第i-1个结点,返回false
return false;
else
{
q=p->next;//q指向第i个结点
if(q==NULL)//若不存在第i个结点,返回false
return false;
e=q->data;
p->next=q->next;//从单链表中删除q结点
free(q);
return true;
}
}
int main()
{
void create_list(list *&l,int a[],int n);//创建链表
void destroy_list(list *&l);//销毁链表
bool list_empty(list *l);//判断线性表是否为空表
int list_length(list *l);//求线性表的长度
void print_list(list *l);//输出链表
bool get_list(list *l,int i,int &e);//求线性表中的某个数据的元素值
int find_list(list *l,int e);//按元素值查找
bool insert_list(list *&l,int i,int e);//插入数据元素
bool delete_list(list *&l,int i,int &e);//删除数据元素
return 0;
} 1,创建链表
中间随你怎么弄都行。
最后 销毁链表
页:
[1]