首页 > 代码库 > 线性表之单链表学习小结(初学数据结构必看)

线性表之单链表学习小结(初学数据结构必看)

花了好几个小时,详细规划出了整个过程,包括所有基本操作。。。有什么疑问请下方留言



#include<iostream>
using namespace std;

#define ElemType char
#define ERROR 0
#define OK 1
typedef struct Node
{
	ElemType data;
	struct Node *next;
}Node,*LinkList;

void init_linklist(LinkList L)/*对单链表进行初始化*/
{
	L=(Node*)malloc(sizeof(Node)); /*申请结点空间*/
	L->next=NULL;                      /*置为空表*/
}

void CreateFromHead(LinkList   L)
{ 
	Node *s;
	char 	c;
	int 	flag=1,k=0;
	while(flag)   /* flag初值为1,当输入"$"时,置flag为0,建表结束*/
	{
		c=getchar();   
		if(c!='$')
		{
			s=(LinkList)malloc(sizeof(Node)); /*建立新结点s*/
			s->data=http://www.mamicode.com/c;>
附带:循环链表的合并算法

LinkList   merge_1(LinkList LA,LinkList LB)
{  /*此算法将两个采用头指针的循环单链表的首尾连接起来*/
	Node *p, *q;
	p=LA;
	q=LB;
	while (p->next!=LA)	p=p->next;	/*找到表LA的表尾,用p指向它*/
	while (q->next!=LB)	q=q->next;	/*找到表LB的表尾,用q指向它*/
	q->next=LA;	/*修改表LB 的尾指针,使之指向表LA 的头结点*/
	p->next=LB->next; /*修改表LA的尾指针,使之指向表LB 中的第一个结点*/
	free(LB);
	return(LA);
}
LinkList  merge_2(LinkList RA,LinkList RB)
{  /*此算法将两个采用尾指针的循环链表首尾连接起来*/
	Node *p;
	p=RA->next; /*保存链表RA的头结点地址*/
	RA->next=RB->next->next;/*链表RB的开始结点链到链表RA的终端结点之后*/
	free(RB->next);/*释放链表RB的头结点*/
	RB->next=p;/*链表RA的头结点链到链表RB的终端结点之后*/
    return  RB;/*返回新循环链表的尾指针*/
}

双向链表的插入与删除

int DlinkIns(DoubleList L,int i,ElemType e)
{
	DNode  *s,*p;
	int k;
	p=L;  
	k=0;                     /*从"头"开始,查找第i-1个结点*/
	while(p->next!=L&&k<i)  /*表未查完且未查到第i-1个时重复,找到p指向第i个*/ 
	{ 
		p=p->next;
		k=k+1; 
	}									/*查找第i-1结点*/
	if(p->next == L)      /*如当前位置p为空表已找完还未数到第i个,说明插入位置不合理*/ 
	{ 
		printf("插入位置不合理!");
		return ERROR;
	}
	s=(DNode*)malloc(sizeof(DNode));
 	if (s)
	{
		s->data=http://www.mamicode.com/e;>
静态链表的初始化,节点分配&回收

void initial(StaticList space, int *av)
{
    int k;
	space[0].cursor=0;      /*设置已用静态单链表的头指针指向位置0*/
	for(k=0;k<Maxsize-1;k++)
		space[k].cursor=k+1;    /*连链*/
	space[Maxsize-1].cursor=0;    /*标记链尾*/
	*av=1;  /*设置备用链表头指针初值*/
}
int getnode(StaticList space, int *av)
/*从备用链表摘下一个结点空间,分配给待插入静态链表中的元素*/
{
	int i;
	i=*av;
	*av=space[*av].cursor;
	return i;
}
void   freenode(StaticList space, int *av, int k)
/*将下标为 k的空闲结点插入到备用链表*/
{
	space[k].cursor=*av;
	*av=k;
}






线性表之单链表学习小结(初学数据结构必看)