码迷,mamicode.com
首页 > 其他好文 > 详细

单链表操作问题,主要是逆操作

时间:2014-10-27 19:01:33      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:blog   io   ar   for   div   问题   log   代码   ad   

工作无事,搞其它事也不太方便,写点简单代码。本来想写的高大上一些,发现用范型不是一点代码的事,还是算了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct list
{
 		int val;
		struct list *next; 		
}Node_def; 

#define NODE_SIZE	(sizeof(Node_def))

#undef T
#define T Node_def
#define T1 int

T * Node_insert(T *head, T1 val)
{
		if ( NULL == head)
		{
		   return NULL;
		} 		 
		T *p = (T*)malloc(NODE_SIZE);
		p->val = val;
		p->next = head->next;
		head->next = p;
		head->val++;
		return p;
}

T * Node_new()
{
 	T *p = (T*)malloc(NODE_SIZE);  
	p->next = NULL;
	p->val = 0;
	return p;		 
}

void Node_print(T *head)
{
 	 if(!head)
	 {
	  	printf("NULL\n");
		return ;	  
     } 
 	 printf("num of list is [%d]:\n", head->val);
 	 if(head->val == 0) return ;
 	 int i = 0;
	 Node_def *p = head->next;
	 while(p)
	 {
	  	printf("[% 6d]", p->val);
		p = p->next;
		if(i++ == 10)
		{
		 	 printf("\n");
			 i = 0;	 	   
		}   
     }
     printf("\n");
}

void Node_free(T *head)
{
 	 if(!head) return ;
 	 printf("num of list for free is [%d]:\n", head->val);
 	 if(head->val <= 0) return;
	 T *p = head->next;
	 T *pp;

	 while(p)
	 {
	   	pp = p;
		p = p->next ;
		//printf("[% 6d] ", pp->val);
		free(pp);
	 } 	
	 free(head); 
  	 printf("\n");
}

void Node_inverse( T *head )
{
#if 0
 	 if(!head) return ;
	 if(head->val <= 0) return ;
	 int num = head->val;
	 int i;
	 T1 *arr = (T1*)malloc(num);
	 if(!arr) exit(0) ;
	 i = 0;
	 T *p = head->next;
	 while(p)
	 {
	  	arr[i++] = p->val;
		p = p->next;	  		 
	 }
	 for ( i = num-1 , p = head->next; i >= 0 ; i-- )
	 {
	  	  p->val = arr[i];
	  	  p = p->next;
	 }
#else
	 if(!head) return ;
	 if(head->val <= 0) return ;
	 int num = head->val;
	 T *p = head->next;
	 T *pp = p->next;
	 p->next = NULL;
	 head->next = p;
	 while (pp)
	 {
	  	p = pp;
	  	pp = pp->next;
	  	p->next = head->next;
	  	head->next = p;
	 }
#endif
	  printf("inserve success\n");

}
int main()
{
 	T *head = Node_new();
 	int i = 0;
 	for ( i = 0 ; i < 1000; i ++)
		Node_insert(head, i);	
	Node_print(head);
	Node_inverse(head);
	Node_print(head);
	Node_free(head);
	return 0;
}

单链表的逆操作问题我用了两种方法,感觉第一种方法不太占优势。不过比较好理解。第二种就是常规方法了。

我这种方法是用了头指针的链表,如果没有头指针,要注意的地方是,逆操作要传指针的地址(或者返回第一个元素的地址)。当然,换成全局变量也是可以的。

有问题请指正 。(这些年工作没太大学习动力,与没人分享和讨论也有点关系)

单链表操作问题,主要是逆操作

标签:blog   io   ar   for   div   问题   log   代码   ad   

原文地址:http://www.cnblogs.com/boota/p/4054686.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!