DYC 发表于 2018-4-20 16:26:54

单链表的实现

怎么把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;
}

ba21 发表于 2018-4-20 21:59:05

1,创建链表

中间随你怎么弄都行。

最后 销毁链表
页: [1]
查看完整版本: 单链表的实现