2010年10月8日

link list

/*
299418045 王國銘 
功能說明 : 可新增刪除節點 
*/ 
#include <stdio.h>
#include <stdlib.h>

struct node{
	int data;
	struct node *next;
};
struct node *front;

void insert(int key);
void show(void);
void del(int key);

void show(){
    struct node *this_node;
    if(front->next != NULL){
        this_node = front->next;
        printf("    front -> ");
        while(this_node != NULL){
            printf("%d -> ",this_node->data);
            this_node = this_node->next;
        }
        printf("NULL \n");
    }else{
        printf("    ERROR : link list中沒有資料可以顯示請按 1 輸入資料 \n");
    }
}

void del(int key){
    struct node *this_node , *tmp_node;
    this_node = front;
    while(this_node->next != NULL){
        if(this_node->next->data == key){
            tmp_node = this_node->next;
            if(tmp_node->next != NULL){
                //找到欲刪除節點 
                this_node->next = tmp_node->next;
            }else{
                //找到欲刪除節點 並在末端 
                this_node->next = NULL;
            }
            free(tmp_node);
            return;
        }
        this_node = this_node->next;
    }
    printf("    ERROR : 找不到指定資料!\n");
}

void insert(int key){
    struct node *new_node;
    new_node = (struct node *) malloc(sizeof(struct node));
    new_node->data = key;
    new_node->next = NULL;
    
    if(front->next == NULL){
        //新增第一筆資料 
        front->next = new_node;
    }else{
        //插入資料 
        struct node *this_node;
        this_node = front;
        while(this_node->next != NULL){
            if(this_node->next->data > key){
                //若下一筆 data 比 key 大 就安插在下一筆與這一筆之前 
                new_node->next = this_node->next;
                this_node->next = new_node;
                return;
            }
            this_node = this_node->next;
        }
        this_node->next = new_node;
    }
}

int main(){
	front = (struct node *)malloc(sizeof(struct node));
	front->next = NULL;
	
    int key = 0;
	while(key != 4){
		printf("1. 新增資料 \n2. 刪除資料 \n3. SHOW出現有link list \n4. 離開程式\n");
        printf("請輸入指令 : ");	
		scanf("%d",&key);
        int n = 0;
        switch(key){
            case 1://1. 新增資料
                printf("    請輸入一整數資料 = ");
                scanf("%d",&n);
                insert(n);	
                show();
                break;	
            case 2://2. 刪除資料
                printf("    請輸入欲的刪除資料 = ");
                scanf("%d",&n);
                del(n);
                show();
                break;	 
            case 3://3. SHOW出現有link list
                show();
                break; 
            case 4://4. 離開程式\n
                exit(0);
                break;
            default:
                break;
        }
        key = 0;
        printf("*************************************************************\n");
	}
}
/*
功能說明 : 可新增刪除節點 
test01.cpp
*/ 
#include <iostream>
using namespace std;  

struct node{
	int data;
	struct node *next;
};
struct node *front;

void insert(int key);
void show(void);
void del(int key);

void show(){
    struct node *this_node;
    if(front->next != NULL){
        this_node = front->next;
        while(this_node != NULL){
            cout << this_node->data <<" -> ";
            this_node = this_node->next;
        }
        cout << "NULL \n";
    }else{
        cout <<"沒有資料 \n";
    }
}

void del(int key){
    struct node *this_node , *tmp_node;
    this_node = front;
    while(this_node->next != NULL){
        if(this_node->next->data == key){
            tmp_node = this_node->next;
            if(tmp_node->next != NULL){
                //找到欲刪除節點 
                this_node->next = tmp_node->next;
            }else{
                //找到欲刪除節點 並在末端 
                this_node->next = NULL;
            }
            free(tmp_node);
            return;
        }
        this_node = this_node->next;
    }
    cout <<" ERROR : 找不到指定資料!\n";
}

void insert(int key){
    struct node *new_node;
    new_node = (struct node *) malloc(sizeof(struct node));
    new_node->data = key;
    new_node->next = NULL;
    
    if(front->next == NULL){
        //新增第一筆資料 
        front->next = new_node;
    }else{
        //插入資料 
        struct node *this_node;
        this_node = front;
        while(this_node->next != NULL){
            if(this_node->next->data > key){
                //若下一筆 data 比 key 大 就安插在下一筆與這一筆之前 
                new_node->next = this_node->next;
                this_node->next = new_node;
                return;
            }
            this_node = this_node->next;
        }
        this_node->next = new_node;
    }
}

int main(){
	front = (struct node *)malloc(sizeof(struct node));
	
	while(true){
		char key;
        
        cout << "請輸入資料或輸入d刪除資料 (輸入q離開程式\n ?";		
		cin >> key;	
		
        switch(key){
            case 'd':
                cout << "--請輸入欲刪除之資料\n ?";		
		        cin >> key;
		        del(key-48);
                show();		
                break;
            case 'q':
                 exit(0);
                 break;
            default:
                insert(key-48);
                show();	
        }
	}
}

沒有留言: