数据结构-链表-单链表-C语言实现

        #include
        #include
        typedef int ElementType;
        typedef int boolean;
        #define TRUE 1;
        #define FALSE 0;
        
        typedef struct Link{
        	ElementType data;
        	struct Link * next;
        }LinkList;
        
        
        //创建一个节点
        //参数可以指定节点的数据
        LinkList * create(ElementType a){
        	LinkList * node = (LinkList*)malloc(sizeof(LinkList));
        	node->next=NULL;
        	node->data=a;
        	return node;
        }
        
        //初始化链表
        //创建头节点
        LinkList * init(){
        	LinkList * header = create(0);
        	return header;
        }
        
        //获取链表最后一个节点
        LinkList * getLast(LinkList * list){
        	LinkList * f = list;
        	while(f->next){
        		f = f->next;
        	}
        	return f;
        }
        
        //获取链表任意位置的节点 
        //位置从0开始 0为头节点
        LinkList * get(LinkList * list,int i){
        	LinkList * f = list;
        	int j=0;
        	if(i<0){
        		return NULL;
        	}
        	if(i == 0){
        		return list;
        	}
        	while(f->next){
        		f = f->next;
        		if(++j ==i){
        			return f;
        		}
        	}
        	return NULL;
        }
        
        //添加节点到链表尾
        boolean add(LinkList * list,ElementType i){
        	LinkList * f = getLast(list);
        	f->next = create(i);
        	list->data+=1;
        	return TRUE;
        }
        
        //判断当前链表是否为空
        boolean isEmpty(LinkList * list){
        	return list->data <= 0;
        }
        
        //移除指定位置的节点
        // 参数 i 指定移除节点的位置 i为 1 移除第一个节点
            boolean remove(LinkList * list,ElementType i){
            	LinkList * parent;
            	LinkList * e;
            	if(isEmpty(list)){
            		return FALSE;
            	}
            	if(i>list->data){
            		printf("超出链表长度\n");
            		return FALSE;
            	}
            	parent = get(list,i-1);
            	if(parent){
            		e= parent->next;
            		parent->next = e->next;
            		free(e);
            		list->data--;
            		return TRUE;
            	}
            	return FALSE;
            }
        
        //更新指定节点的值
        boolean update(LinkList * list,int data,int i){
        	LinkList * ele = get(list,i);
        	if(ele){
        		ele->data = data;
        		return TRUE;
        	}
        	return FALSE;
        }
        
        //指定位置插入节点
       boolean insert(LinkList * list,LinkList * element,int i){
    	LinkList * parent = get(list,i-1);
    	LinkList * ele;
    	if(!parent){
    		return FALSE;
    	}
    	ele = parent->next; 
    	parent->next = element;
    	element->next = ele;
    	list->data++;
    	return TRUE;
    }
        
  int main(){
	int i;
	//初始化链表,创建头结点
	LinkList * header = init();

	LinkList * f = header;

	//未添加节点之前查看链表是否为空
	printf("当前链表是否为空:%d\n",isEmpty(header));

	//添加六个节点,并且指定节点的值为当前i的值
	for(i=1;i<6;i++){
		add(header,i);
		printf("添加元素%d\n",i);
	}

	//在链表尾部添加一个节点
	add(header,70);

	//在第一个位置上插入一个节点,该节点的数据域值为12
	insert(header,create(12),1);

	//更新链表第二个节点的数据域的值为77
	update(header,77,2);


	//添加节点后查看链表是否为空
	printf("当前链表是否为空:%d\n\n\n",isEmpty(header));

	//链表对头结点的数据域进行维护,用来表示当前链表的节点个数
	printf("当前链表的节点个数:%d\n",header->data);

	//遍历链表的每一个节点
	while(f->next){
		f = f->next;
		printf("当前数据:%d\n",f->data);
	}

	return 0;
}

你可能感兴趣的:(数据结构)