风言枫语  

      顺序表相比,链表增强了数据间的连接,一个接一个,发现July的博客比较深层次,还是打好基础再了解更深一层的东西。

      还是分LinkList.h,LinkList.c,main.c

     之前匆匆忙忙赶东西时,就copy一大段改改就交了。自己重写后发现诸多问题在这一块里。

       LinkList.h

#include<stdio.h>
#include<malloc.h>
typedef int DataType;
typedef struct SimpleLinkList *Node;
struct SimpleLinkList{
	DataType info;
	Node link;
} ;
typedef struct SimpleLinkList *LinkList;

LinkList CreateNUllList();
int isNull(LinkList linklist);
int insertPost(LinkList linklist,Node node,DataType element);
int insertBack(LinkList linklist,Node node,DataType element);
int printList(LinkList linklist);
Node searchElement(LinkList linklist,DataType element);
DataType showValue(LinkList linklist,Node node);
int deleteElement(LinkList linklist,DataType element);
LinkList combine(LinkList one,LinkList another);


LinkList.c


#include "LinkList.h"
LinkList CreateNUllList(){
	LinkList linklist = (LinkList)malloc(sizeof(struct SimpleLinkList));
	if(linklist != NULL)
		linklist -> link = NULL;
	else 
		printf("create fail!");
	return linklist;
} 


int isNull(LinkList linklist){
	return (linklist != NULL); // not null return 1 
}

int insertPost(LinkList linklist,Node node,DataType element){
	Node temp = (Node)malloc(sizeof(struct SimpleLinkList));
	// 前插  注意如果没有任何元素 那么把头结点指向 element 
	if(temp == NULL){
		printf("insert fail");
		return 0;
	}else{
		for(linklist;linklist!= NULL; linklist = linklist -> link) {
			if(linklist	 -> link == node){
				temp ->info = element;
				linklist ->link = temp;
				temp ->link = node;
			}
		}
	}
	return 1;
	//前插的节点 是要我们自己传参注意 而不是把函数写成 


} 
// insert forward
//带头节点的链表 头结点没有值 
// 其实 所谓的后插   是后插 但是现在的node是 链表  实际插入的时候
//所以  node的link是第一个数  所谓变成“前插” 
int insertBack(LinkList linklist,Node node,DataType element){
	Node temp = (Node)malloc(sizeof(struct SimpleLinkList));
	if(temp == NULL){	
		printf("insert element fail!");
		return 0;
	}
	temp -> info = element; 
	temp -> link = node -> link;
	node -> link = temp;
	
	
	return 1;
} //insert back

int printList(LinkList linklist){
	if(linklist == NULL){
		printf("it is null");
		return 0;
	}
	
	while(linklist -> link != NULL){
		printf("%2d",linklist->link->info);
		linklist  = linklist -> link ;
	}
	printf("\n");
	return 1;
	
}

Node searchElement(LinkList linklist,DataType element){
	Node node;
	if(linklist == NULL){
		printf("the element was not found");
		return NULL;
	} 
	node = linklist -> link; 
	while(node != NULL && node -> info != element){
		node = node -> link; 
	} 
	if(node  == NULL){
		return NULL;
	}
	return node;
		
}
DataType showValue(LinkList linklist,Node node){
    Node temp;
	if(linklist == NULL){
		printf("the element was not found");
		return NULL;
	} 
	temp = linklist -> link; 
	while(temp != NULL && temp -> link != node){
		temp = temp -> link; 
	} 
	return node;
}

int deleteElement(LinkList linklist,DataType element){
    Node node;
    Node temp;
	if(linklist == NULL){
		printf("the element you deleted was not found");
		return 0;
	} 
	node = linklist ; 
	while(node ->link!= NULL && node ->link-> info != element){
		// link 的info   是element之前。 
		node = node -> link; 
	//	printf("test\n");link ->info 先要判断link为不为空! 
	} 
//	printf("test2");
	if(node->link== NULL ){
		printf("the element you deleted was not found\n");
		return 0;
	} else {
		temp = node->link;
		node -> link = temp -> link;
		free(temp);
		printf("the element is deleted\n");
		return 1;
	}
	
}

LinkList combine(LinkList one,LinkList another){
	//终于知道错在哪里 节点没有分配 根本就不存在  数据结构就是数据结构
	//原本是空的  malloc一个节点 插进去 
	
	//问题二: one ->link!= NULL 这是对的   	while(one!= NULL)
	//当one 为null了  也就没有link了 怎么 malloc 新的东西都是没用的。 
	Node temp ;
	LinkList linken;
	linken = one;
	while(one ->link!= NULL)
		one = one ->link;
	
	for(another;another->link!= NULL; another = another ->link){
		temp = (Node)malloc(sizeof(struct SimpleLinkList));
		temp ->info = another ->link ->info;
		temp ->link = another ->link ->link;
		one ->link = temp;
		one = one ->link;
	} 
	return linken;
	// linken 临时指向头节点  能返回整个表 
} 


main.c


#include "LinkList.h"
int main(){
	int i,element;
	LinkList linklist1 = CreateNUllList();
	LinkList linklist2 = CreateNUllList();
	LinkList linklist3 = CreateNUllList();
	Node note = linklist1;
	Node note2 = linklist1;
	//if(note != NULL) printf("yes");
	for(i = 0;i<10;i++){
	    
        while(note != NULL)
				note = note -> link;		
        insertPost(linklist1, note,i);
      
 	
	
	}//终于完成  前插  使得 
 
 	for(i = 0;i<10;i++){		
		insertBack(linklist2, linklist2,i);
	}
	//printf("%d",linklist->link->info);	
	printList(linklist1);
	printList(linklist2);
	
/*	printf("input the value of the element you search\n");
 	scanf("%d",&element);
 	if(searchElement(linklist1,element) == NULL)
	 	printf("not found"); 
	for(i=0;note2 != searchElement(linklist1,element);note2 = note2 ->link,i++ )
		;//空语句 不执行 
	if(searchElement(linklist1,element) == NULL)
	 	printf("not found\n"); 
	else
		printf("%d is the %dth element of the linklist\n",element,i); 
	
	printf("input the value of the element you delete\n");
 //	scanf("%d",&element);
 	//deleteElement(linklist1,element);
 	
//	printList(linklist1); 
	*/
	linklist3 = combine(linklist1,linklist2);
	printList(linklist3); 
	return 0;
} 


       一个月多多少少学了点。java的LinkList原来这样实现,单纯用的话很简单。

   

 

posted on 2013-08-17 23:16  风言枫语  阅读(231)  评论(0编辑  收藏  举报