数据结构考研笔记——链表常考操作

1.尾插法建立单链表

假设有n个元素已经存储在数组a中,用尾插法建立链表C:

void createlistR(LNode *&C, int a[], int n)
{
	LNode *s, *r;           //s用来指向新申请的结点,r始终指向C的终端结点
	int i;
	C=(LNode *) malloc (sizeof(LNode));    //申请C的头结点空间
	C->next=NULL;
	r=c;                   //r指向头结点,因为此时头结点就是终端结点 
	for (i=0; i<n; ++i)    //循环申请n个结点来接收数组a中的元素 
	{
		s=(LNode*) malloc (sizeof(LNode));   //s指向新申请的结点
		s->data = a[i];    //用新申请的结点来接收a中的一个元素 
		r->next = s;       //用r来接纳新结点 
		r = r->next;       //r指向终端结点,以便于接纳下一个到来的结点 
	} 
	r->next = NULL;        //C建立完成 
} 

2.头插法建立单链表

void createlistR(LNode *&C, int a[], int n)
{
	LNode *s;           
	int i;
	C=(LNode *) malloc (sizeof(LNode));    
	C->next=NULL; 
	for (i=0; i<n; ++i)     
	{
		s=(LNode*) malloc (sizeof(LNode));   
		s->data = a[i];    
        /*头插法关键步骤*/
		s->next = C->next;       //s所指新结点的指针域next指向C中的开始结点 
		C->next = s;             //头结点的指针域next指向s结点,使得s成为新的开始结点 
	} 
} 

3.单链表结点的删除操作

删除操作除了修改指针之外,还需要释放所删除结点的内存空间

q = p->next;
p->next = p->next->next;
free(q);

4.单链表的查找操作

查找链表C(带头结点)中是否存在一个值为x的结点,若存在,则删除该结点并返回1,否则返回0:

int findAnddelete(LNode *C, int x)
{
	LNode *p, *q;
	p = C;
	/*查找部分开始*/
	while (p->next != NULL)
	{
		if (p->next->data == x)
		   break;
		p = p->next;
	}
	if (p->next == NULL)
	   return 0;
	else
	{
		/*删除部分开始*/
		q = p->next;
		p->next = p->next->next;
		free(q);
		return 1;
	}
} 

5.采用尾插法建立双链表

void createDlistR(DLNode *&L, int a[], int n)
{
	LNode *s, *r;           
	int i;
	L=(DLNode *) malloc (sizeof(DLNode));    
	L->prior = NULL;
	L->next = NULL;
	r=L;                   
	for (i=0; i<n; ++i)    
	{
		s=(DLNode*) malloc (sizeof(DLNode));   
		s->data = a[i]; 
        //与单链表不同之处   
		r->next = s;        
		s->prior = r;
		r = s;        
	} 
	r->next = NULL;         
}

6.双链表插入结点算法

s->next = p->next;
s->prior = p;
p->next = s;
s->next->prior = s;  //若p指向最后一个结点,则本行可去

7.双链表查找结点算法

DLNode* findNode (DLNode *C, int x)
{
	DLNode *p = C->next;
	while (p != NULL)
	{
		if (p->data == x)
		   break;
		p = p->next;
	}
    return p;
}

8.双链表删除结点算法

q = p->next;
p->next = q->next;
q->next->prior = p;
free(q);

猜你喜欢

转载自blog.csdn.net/SmiledrinkCat/article/details/81362743
今日推荐