程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 數據結構 鏈表及合並

數據結構 鏈表及合並

編輯:C++入門知識

順序表相比,鏈表增強了數據間的連接,一個接一個,發現July的博客比較深層次,還是打好基礎再了解更深一層的東西。

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

     之前匆匆忙忙趕東西時,就copy一大段改改就交了。自己重寫後發現諸多問題在這一塊裡。

       LinkList.h

 

<SPAN style="FONT-SIZE: 18px">#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);
</SPAN>
<SPAN style="FONT-SIZE: 18px">#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 臨時指向頭節點  能返回整個表 
} </SPAN>
<SPAN style="FONT-SIZE: 18px">#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;
} </SPAN>

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved