头歌数据结构——链表及其应用

 第1关:链表的实现之查找功能

#include 
#include 
#include "LinkList.h"

void LL_Initiate(LinkList &L)
//单链表的初始化,即:构造一个带头结点的空的单链表
{
	L=(LNode *)malloc(sizeof(LNode));
    L->next=NULL;
} 

void LL_Free(LinkList &L)
// 释放链表中各个结点。
{
	LinkList p;
	while(L)
	{
		p=L;
		L=L->next;
		free(p);
	}
}

bool LL_IsEmpty(LinkList L)
// 判断链表是否为空。
{
    return L->next==NULL;
}

void LL_Create_H(LinkList &L,int n)
// 输入n个数据元素,采用头插法,创建一个带头结点的单链表L。
{
	LNode *s; int i;
	L=(LNode *)malloc(sizeof(LNode));	L->next=NULL; //建立一个带头结点的空链表
	for(i=0;idata); //输入元素值		
		s->next=L->next;   L->next=s;  //插入到表头			
	}
}

void LL_Create_R(LinkList &L,int n)
// 输入n个数据元素,采用尾插法,创建一个带头结点的单链表L。
{    
	LNode *r,*s; int i;
	L=(LNode *)malloc(sizeof(LNode));	L->next=NULL; //建立一个带头结点的空链表 
	r=L;  //尾指针r指向头结点
	for(i=0;idata); //输入元素值		
		s->next=NULL; r->next=s; //插入到表尾 
		r=s;  //r指向新的尾结点		
	}	
}

void LL_Print(LinkList L)
// 输出整个线性表。
{
    LNode *p;
	p=L->next;
	while(p)
	{
		printf("%d  ",p->data); p=p->next;
	}
	printf("\n");
}

void LL_GetAt(LinkList L, int i, ElemType &e)
// 在带头结点的单链表L中获取第i个元素的值赋给e,i的取值范围[1,n]
{
	// 请在这里补充代码,完成本关任务
    /********** Begin *********/
    LinkList p=L->next;
    for(int j=1;jnext;
    
    e=p->data;

	/********** End **********/
}

LNode *LL_FindValue(LinkList L, ElemType e,int &i)
//在带头结点的单链表L中查找第一个值为e的元素,
//找到则将该元素在链表中的位置赋给i,并返回该结点指针,否则i赋值为0并返回空指针
{
	// 请在这里补充代码,完成本关任务
    /********** Begin *********/
	LinkList p=L->next;
    for(int j=1;p!=NULL;p=p->next,j++)
    {
        if(p->data==e)
        {
            i=j;
            return p;
        }
    }
    i=0;
    return NULL;
	/********** End **********/
}


 

第2关:链表的实现之增删功能 

#include 
#include 
#include "LinkList.h"

void LL_Initiate(LinkList &L)
//单链表的初始化,即:构造一个带头结点的空的单链表
{
	L=(LNode *)malloc(sizeof(LNode));
    L->next=NULL;
} 

void LL_Free(LinkList &L)
// 释放链表中各个结点。
{
	LinkList p;
	while(L)
	{
		p=L;
		L=L->next;
		free(p);
	}
}

bool LL_IsEmpty(LinkList L)
// 判断链表是否为空。
{
    return L->next==NULL;
}

void LL_Create_H(LinkList &L,int n)
// 输入n个数据元素,采用头插法,创建一个带头结点的单链表L。
{
	LNode *s; int i;
	L=(LNode *)malloc(sizeof(LNode));	L->next=NULL; //建立一个带头结点的空链表
	for(i=0;idata); //输入元素值		
		s->next=L->next;   L->next=s;  //插入到表头			
	}
}

void LL_Create_R(LinkList &L,int n)
// 输入n个数据元素,采用尾插法,创建一个带头结点的单链表L。
{    
	LNode *r,*s; int i;
	L=(LNode *)malloc(sizeof(LNode));	L->next=NULL; //建立一个带头结点的空链表 
	r=L;  //尾指针r指向头结点
	for(i=0;idata); //输入元素值		
		s->next=NULL; r->next=s; //插入到表尾 
		r=s;  //r指向新的尾结点		
	}	
}

void LL_Print(LinkList L)
// 输出整个线性表。
{
    LNode *p;
	p=L->next;
	while(p)
	{
		printf("%d  ",p->data); p=p->next;
	}
	printf("\n");
}

void LL_InsAt(LinkList L,int i,ElemType e)
// 在带头结点的单链表L中第i个位置插入值为e的新元素,i的取值范围[1,n+1]
{
	// 请在这里补充代码,完成本关任务
    /********** Begin *********/
	int j=1;
    LinkList p=L,pnew;

    while(jnext;
        j++;
    }
    pnew=(LinkList)malloc(sizeof(LNode));
    pnew->data=e;
    pnew->next=p->next;
    p->next=pnew;

	/********** End **********/
}

void LL_DelAt(LinkList L,int i)
// 在带头结点的单链表L中,删除第i个元素,i的取值范围[1,n]
{
	// 请在这里补充代码,完成本关任务
    /********** Begin *********/
	int j=1;
    LinkList p=L,pDelect;
    while(jnext;
        j++;
    }
    pDelect=p->next;
    p->next=p->next->next;
    free(pDelect);
	/********** End **********/
}

void LL_DelValue(LinkList L, ElemType e)
// 删除第一个值为e的数据元素
{
	// 请在这里补充代码,完成本关任务
    /********** Begin *********/
    LinkList p;
    p=L->next;
    int j=1;
    while(p)
    {
        if(p->data==e)
        {
            LL_DelAt(L,j);
            break;
        }
        p=p->next;
        j++;
    }

	/********** End **********/
}

 

第3关:链表的合并 

#include 
#include 
#include "LinkList.h"

void LL_Initiate(LinkList &L)
//单链表的初始化,即:构造一个带头结点的空的单链表
{
	L=(LNode *)malloc(sizeof(LNode));
    L->next=NULL;
} 

void LL_Free(LinkList &L)
// 释放链表中各个结点。
{
	LinkList p;
	while(L)
	{
		p=L;
		L=L->next;
		free(p);
	}
}

bool LL_IsEmpty(LinkList L)
// 判断链表是否为空。
{
    return L->next==NULL;
}

void LL_Create_H(LinkList &L,int n)
// 输入n个数据元素,采用头插法,创建一个带头结点的单链表L。
{
	LNode *s; int i;
	L=(LNode *)malloc(sizeof(LNode));	L->next=NULL; //建立一个带头结点的空链表
	for(i=0;idata); //输入元素值		
		s->next=L->next;   L->next=s;  //插入到表头			
	}
}

void LL_Create_R(LinkList &L,int n)
// 输入n个数据元素,采用尾插法,创建一个带头结点的单链表L。
{    
	LNode *r,*s; int i;
	L=(LNode *)malloc(sizeof(LNode));	L->next=NULL; //建立一个带头结点的空链表 
	r=L;  //尾指针r指向头结点
	for(i=0;idata); //输入元素值		
		s->next=NULL; r->next=s; //插入到表尾 
		r=s;  //r指向新的尾结点		
	}	
}

void LL_Print(LinkList L)
// 输出整个链表。
{
    LNode *p;
	p=L->next;
	while(p)
	{
		printf("%d  ",p->data); p=p->next;
	}
	printf("\n");
}

void MergeList_L(LinkList LA,LinkList LB,LinkList &LC)
//已知单链表LA和LB的元素按值非递减排列
//归并LA和LB得到新的单链表LC,LC的元素也按值非递减排列。
{
	// 请在这里补充代码,完成本关任务
    /********** Begin *********/
	LL_Initiate(LC);
    LNode *p1=LA->next,*p2=LB->next,*r=LC,*p3;
    while(p1!=NULL&&p2!=NULL)
    {
        p3=(LNode *)malloc(sizeof(LNode));
        if(p1->data>p2->data)
        {
            p3->data=p2->data;
            p2=p2->next;
            
        }
        else{
            p3->data=p1->data;
            p1=p1->next;
        }
        r->next=p3;
        r=p3;
        p3->next=NULL;
    }
    if(p1==NULL)
    {
        while(p2!=NULL)
        {
            p3=(LNode *)malloc(sizeof(LNode));
            p3->data=p2->data;
            p2=p2->next;
            r->next=p3;
            r=p3;
        }
    }
    else
    {
        while(p1!=NULL)
        {
            p3=(LNode *)malloc(sizeof(LNode));
            p3->data=p1->data;
            p1=p1->next;
            r->next=p3;
            r=p3;
        }
    }
	/********** End **********/
}  

你可能感兴趣的:(Educoder,数据结构与算法,头歌数据结构,链表,数据结构,算法,c++)