C 语言实例8——单链表 大综合(插入 删除 逆排序....)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<assert.h>


#define  FALSE    0
#define  TRUE     1

// 单链表声明
typedef struct NODE
{
   struct  NODE  *link;
   int     value;
}Node;

// 插入函数 效率不错
int sll_insert(register Node **linkp , int new_value)
{
  register Node *current;
  register Node * news;

	/*寻找正确的插入位置,方法是按顺序访问链表,直到到达值大于或等于新插入值的节点*/
	while((current = *linkp) != NULL && current->value < new_value)
	{
	  linkp = &current->link;
	}

	/* 为新节点分配内存,并把新值存入到新节点中,如果内存分配失败,函数返回FALSE*/
	news = (Node *) malloc(sizeof(Node));
	if(news == NULL)
	   return FALSE;
	news->value =new_value;
	/* 把新节点插入到链表中,并返回TRUE*/
	news->link =current;
	*linkp = news;
	return TRUE;
}

// 在链表中寻找特定的值,返回链表节点指针
Node * sll_find(Node *first,int desired_value)
{
	for(;first!=NULL;first=first->link)
		if(first->value == desired_value) 
		  return first;		
	return NULL;	
}
//打印链表数据
void printSll(Node *root)
{
  while(root!=NULL)
  {
	  printf("%d\n",root->value);
	  root = root->link;
  }
}

//输出链表节点个数
int sll_count(Node *first)
{
	int count=0;
	for(;first!=NULL;first=first->link)
		 count++;
	return count;				
}
// 反序排列一个单链表所有节点,返回指向单链表的新头节点指针
Node * sll_reverse(Node *current)
{
     Node *previous;
	 Node *next;

	 for(previous = NULL;current != NULL; current =next)
	 {
		 next = current->link;
		 current->link = previous;
		 previous = current;
	 }
	 return previous;
}

// 功能:单链表中删除指定节点。
// 参数:第一个参数指向链表的根指针,第二个参数指向需要被删除的节点。
// 返回:成功返回TRUE,否则FALSE。
int sll_remove(Node **linkp,Node *del)
{
	register Node *current;
	assert(del!=NULL);

	// 寻求要删除的节点
	while((current = *linkp) != NULL && current != del)
	    linkp = &current->link;
	if(current == del)
	{
		*linkp = current->link;
		free(current);
		return TRUE;
	}
	else
		return FALSE;
}

猜你喜欢

转载自blog.csdn.net/qq_27762895/article/details/83152256