数据结构 链表及合并

      顺序表相比,链表增强了数据间的连接,一个接一个,发现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原来这样实现,单纯用的话很简单。

   

 

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