1. 程式人生 > >基於 連結串列 實現通訊錄的功能

基於 連結串列 實現通訊錄的功能

簡介

最近, 我編寫了一個程式,用於實現手機通訊錄的功能。
該程式基於 單向迴圈連結串列 , 實現了 新建聯絡人、(按編號、姓名、號碼)刪除聯絡人、(按編號、姓名、號碼)修改聯絡人、(按編號、姓名、號碼)查詢聯絡人、(按姓名、號碼排序)遍歷顯示聯絡人的功能, 並且在主程式中為其加入了操作介面的設計。

程式:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define T 1
#define F -1

typedef int Boolean;
typedef struct Node* node;

void
id_order(node head); Boolean init(node* head); int length(node head); void print(node head); Boolean insert_tail(node head); Boolean delete_id(node head); void delete_name(node head); void delete_num(node head); Boolean update_id(node head); Boolean update_name(node head); Boolean update_num(node head); Boolean query_id(node head); void
query_name(node head); void query_num(node head); void bubblesort_num(node head); void quicksort_name(node head, int left, int right); node unit_index(node head,int index); struct Node { int id; char name[20]; char num[12]; char addr[20]; node next; }; int main() { int flag; node head; init(&head); while
(1) { printf("******************************\n"); printf("--MENU--\n"); printf("1.INSERT\n2.DELETE\n3.UPDATE\n4.QUERY\n5.PRINT\n"); int key; scanf("%d", &key); switch(key) { case 1: insert_tail(head); break; case 2: flag = 1; while (flag) { printf("******************************\n"); printf("--DELETE--\n"); printf("1.by ID\n2.by_NAME\n3.by_NUMBER\n0.BACK\n"); scanf("%d", &key); switch(key) { case 0: flag = 0; break; case 1: delete_id(head); break; case 2: delete_name(head); break; case 3: delete_num(head); break; default: printf("(ERROR)\n"); break; } } break; case 3: flag = 1; while (flag) { printf("******************************\n"); printf("--UPDATE--\n"); printf("1.by ID\n2.by_NAME\n3.by_NUMBER\n0.BACK\n"); scanf("%d", &key); switch(key) { case 0: flag = 0; break; case 1: update_id(head); break; case 2: update_name(head); break; case 3: update_num(head); break; default: printf("(ERROR)\n"); break; } } break; case 4: flag = 1; while (flag) { printf("******************************\n"); printf("--QUERY--\n"); printf("1.by ID\n2.by_NAME\n3.by_NUMBER\n0.BACK\n"); scanf("%d", &key); switch(key) { case 0: flag = 0; break; case 1: query_id(head); break; case 2: query_name(head); break; case 3: query_num(head); break; default: printf("(ERROR)\n"); break; } } break; case 5: flag = 1; while (flag) { printf("******************************\n"); printf("--PRINT--\n"); printf("1.by_NAME\n2.by_NUMBER\n0.BACK\n"); scanf("%d", &key); switch(key) { case 0: flag = 0; break; case 1: printf("******************************\n"); printf("--PRINT_by_NAME--\n"); quicksort_name(head, 1, length(head)); print(head); break; case 2: bubblesort_num(head); break; default: printf("(ERROR)\n"); break; } } break; default: printf("(ERROR)\n"); break; } } return 0; } Boolean insert_tail(node head) { printf("******************************\n"); printf("--CREAT NEW CONTATOR--\n"); char name[20]; char num[12]; char addr[20]; printf("NAME: "); scanf("%s", &name); printf("NUMBER: "); scanf("%s", &num); printf("ADDRESS: "); scanf("%s", &addr); node newnode = (node)malloc(sizeof(struct Node)); if (NULL == newnode) { return F; } strcpy(newnode->name, name); strcpy(newnode->num, num); strcpy(newnode->addr, addr); node temp = head; while (temp->next != head) { temp = temp->next; } temp->next = newnode; newnode->next = head; id_order(head); printf("(SAVE SUCCESS!)\n"); return T; } Boolean delete_id(node head) { printf("******************************\n"); printf("--DELETE_ID--\n"); int id; printf("ID: "); scanf("%d", &id); if (id <= 0 || id > length(head)) { printf("(NOT FOUND ID: %d)\n", id); return F; } int i; node temp = head; for (i = 1; i < id; i++) { temp = temp->next; } node temp2 = temp->next; temp->next = temp->next->next; free(temp2); id_order(head); printf("(DELETE SUCCESS!)\n"); return T; } void delete_name(node head) { printf("******************************\n"); printf("--DELETE_NAME--\n"); char name[20]; printf("NAME: "); scanf("%s", &name); int count = 0; node temp = head; while (temp->next != head) { if (!(strcmp(temp->next->name, name))) { count++; node temp2 = temp->next; temp->next = temp->next->next; free(temp2); } else { temp = temp->next; } } if (count) { id_order(head); printf("(DELETE SUCCESS!)\n"); } else { printf("(NOT FOUND NAME: %s)\n", name); } } void delete_num(node head) { printf("******************************\n"); printf("--DELETE_NUMBER--\n"); char num[12]; printf("NUMBER: "); scanf("%s", &num); int count = 0; node temp = head; while (temp->next != head) { if (!(strcmp(temp->next->num, num))) { count++; node temp2 = temp->next; temp->next = temp->next->next; free(temp2); } else { temp = temp->next; } } if (count) { id_order(head); printf("(DELETE SUCCESS!)\n"); } else { printf("(NOT FOUND NUMBER: %s)\n", num); } } Boolean update_id(node head) { printf("******************************\n"); printf("--UPDATE_ID--\n"); int id; printf("ID: "); scanf("%d", &id); if (id <= 0 || id > length(head)) { printf("(NOT FOUND ID: %d)\n", id); return F; } printf("PLEASE INPUT NEW INFOMATION:\n"); char name[20]; char num[12]; char addr[20]; printf("NAME: "); scanf("%s", &name); printf("NUMBER: "); scanf("%s", &num); printf("ADDRESS: "); scanf("%s", &addr); int i; for (i = 1; i <= id; i++) { head = head->next; } strcpy(head->name, name); strcpy(head->num, num); strcpy(head->addr, addr); printf("(UPDATE SUCCESS!)\n"); return T; } Boolean update_name(node head) { printf("******************************\n"); printf("--UPDATE_NAME--\n"); char old_name[20]; printf("OLD_NAME: "); scanf("%s", &old_name); node temp = head; int count = 0; while (temp->next != head) { if (!(strcmp(temp->next->name, old_name))) { count++; } temp = temp->next; } if (0 == count) { printf("(NOT FOUND THIS NAME.)\n"); return F; } printf("PLEASE INPUT NEW INFOMATION:\n"); char name[20]; char num[12]; char addr[20]; printf("NAME: "); scanf("%s", &name); printf("NUMBER: "); scanf("%s", &num); printf("ADDRESS: "); scanf("%s", &addr); temp = head; while (temp->next != head) { if (!(strcmp(temp->next->name, old_name))) { strcpy(temp->next->name, name); strcpy(temp->next->num, num); strcpy(temp->next->addr, addr); } temp = temp->next; } printf("(UPDATE SUCCESS!)\n"); return T; } Boolean update_num(node head) { printf("******************************\n"); printf("--UPDATE_NUMBER--\n"); char old_num[20]; printf("OLD_NUMBER: "); scanf("%s", &old_num); node temp = head; int count = 0; while (temp->next != head) { if (!(strcmp(temp->next->num, old_num))) { count++; } temp = temp->next; } if (0 == count) { printf("(NOT FOUND THIS NUMBER.)\n"); return F; } printf("PLEASE INPUT NEW INFOMATION:\n"); char name[20]; char num[12]; char addr[20]; printf("NAME: "); scanf("%s", &name); printf("NUMBER: "); scanf("%s", &num); printf("ADDRESS: "); scanf("%s", &addr); temp = head; while (temp->next != head) { if (!(strcmp(temp->next->num, old_num))) { strcpy(temp->next->name, name); strcpy(temp->next->num, num); strcpy(temp->next->addr, addr); } temp = temp->next; } printf("(UPDATE SUCCESS!)\n"); return T; } Boolean query_id(node head) { printf("******************************\n"); printf("--QUERY_ID--\n"); int id; printf("ID: "); scanf("%d", &id); if (id <= 0 || id > length(head)) { printf("(NOT FOUND ID: %d)\n", id); return F; } int i; for (i = 1; i <= id; i++) { head = head->next; } printf("No.%-5dNAME: %-15sNUMBER: %-15sADDRESS: %-15s\n", head->id, head->name, head->num, head->addr); return T; } void query_name(node head) { printf("******************************\n"); printf("--QUERY_NAME--\n"); char name[20]; printf("NAME: "); scanf("%s", &name); int count = 0; node temp = head; while (temp->next != head) { if (!(strcmp(temp->next->name, name))) { count++; printf("No.%-5dNAME: %-15sNUMBER: %-15sADDRESS: %-15s\n", temp->next->id, temp->next->name, temp->next->num, temp->next->addr); } temp = temp->next; } if (0 == count) { printf("(NOT FOUND NAME: %s)\n", name); } } void query_num(node head) { printf("******************************\n"); printf("--QUERY_NUMBER--\n"); char num[12]; printf("NUMBER: "); scanf("%s", &num); int count = 0; node temp = head; while (temp->next != head) { if (!(strcmp(temp->next->num, num))) { count++; printf("No.%-5dNAME: %-15sNUMBER: %-15sADDRESS: %-15s\n", temp->next->id, temp->next->name, temp->next->num, temp->next->addr); } temp = temp->next; } if (0 == count) { printf("(NOT FOUND NUMBER: %s)\n", num); } } Boolean init(node* head) { node newnode = (node)malloc(sizeof(struct Node)); if (NULL == newnode) { return F; } newnode->id = 0; strcpy(newnode->name, "0"); strcpy(newnode->num, "0"); strcpy(newnode->addr, "0"); newnode->next = newnode; *head = newnode; return T; } void print(node head) { node temp = head; while (temp->next != head) { printf("No.%-5dNAME: %-15sNUMBER: %-15sADDRESS: %-15s\n", temp->next->id, temp->next->name, temp->next->num, temp->next->addr); temp = temp->next; } } int length(node head) { int count = 0; node temp = head; while(temp->next != head) { count++; temp = temp->next; } return count; } void id_order(node head) { int count = 0; node temp = head; while (temp->next != head) { temp->next->id = ++count; temp = temp->next; } } void bubblesort_num(node head) { printf("******************************\n"); printf("--PRINT_by_NUM--\n"); int i, j, m; for (i = 1; i < length(head); i++) { for (j = length(head); j > i; j--) { node temp1 = head; for (m = 0; m < j - 2; m++) { temp1 = temp1->next; } node temp2 = temp1->next; if (strcmp(temp2->next->num, temp2->num) < 0) { temp1->next = temp2->next; temp2->next = temp1->next->next; temp1->next->next = temp2; } } } id_order(head); print(head); } void quicksort_name(node head, int left, int right) { if (left >= right) { return; } int i = left; int j = right; char key_name[20]; char key_num[12]; char key_addr[20]; strcpy(key_name, unit_index(head, left)->name); strcpy(key_num, unit_index(head, left)->num); strcpy(key_addr, unit_index(head, left)->addr); while (i < j) { while (i < j && (strcmp(unit_index(head, j)->name, key_name) >= 0)) { j--; } strcpy(unit_index(head, i)->name, unit_index(head, j)->name); strcpy(unit_index(head, i)->num, unit_index(head, j)->num); strcpy(unit_index(head, i)->addr, unit_index(head, j)->addr); while (i < j && (strcmp(unit_index(head, i)->name, key_name) <= 0)) { i++; } strcpy(unit_index(head, j)->name, unit_index(head, i)->name); strcpy(unit_index(head, j)->num, unit_index(head, i)->num); strcpy(unit_index(head, j)->addr, unit_index(head, i)->addr); } strcpy(unit_index(head, i)->name, key_name); strcpy(unit_index(head, i)->num, key_num); strcpy(unit_index(head, i)->addr, key_addr); quicksort_name(head, left, i - 1); quicksort_name(head, i + 1, right); } node unit_index(node head, int index) { int i; node temp = head; for (i = 0; i < index; i++) { temp = temp->next; } return (temp); }

執行介面

insert
delete
update
query
print by name
print by number
back and error

心得

在寫通訊錄程式的過程中, 我獲益匪淺, 在此進行記錄。
首先, 我對連結串列的認識更加人深刻了, 對連結串列和指標的使用也更加熟悉了;在寫遍歷聯絡人(print)的子程式時, 按姓名順序遍歷我採用了快速排序法, 按號碼順序遍歷我採用了氣泡排序法, 對兩種排序演算法有了更進一步的理解; 聯絡人的姓名、號碼、地址均採用字串型別, 在處理(輸入、排序、輸出)其的過程中, 幫助我複習了字串型別資料的輸入、輸出和常用處理字串的函式的相關知識; 新建、刪除聯絡人的過程中, 需要申請空間和釋放空間, 這部分幫助我強化了記憶體管理相關函式的使用; 該程式由17個子函式和1個main函式組成, 在編寫程式的過程中, 幫助我鞏固了鞏固了子函式的呼叫,、引數的傳遞、函式返回值以及陣列作為引數傳遞的過程中弱化為指標的相關知識; 在main函式中, 我對整個程式執行中的介面進行了一定的設計, 鍛鍊了我人機互動介面的設計能力。

相關推薦

基於 連結串列 實現通訊錄功能

簡介 最近, 我編寫了一個程式,用於實現手機通訊錄的功能。 該程式基於 單向迴圈連結串列 , 實現了 新建聯絡人、(按編號、姓名、號碼)刪除聯絡人、(按編號、姓名、號碼)修改聯絡人、(按編號、姓名、號碼)查詢聯絡人、(按姓名、號碼排序)遍歷顯示聯絡人的功能,

[原始碼和文件分享]C++實現基於連結串列通訊錄管理系統

摘 要 隨著計算機應用技術的快速發展和日益普及,網路也遍及到我們生活的每個角落,為我們的學習和工作帶來極大的方便。很多人都使用過傳統的紙質通訊錄,與之不同的另外一種管理方式——程式通訊錄管理。程式通訊錄管理系統面向全部使用者,它是一種先進、方便、快捷、簡易的方式,能快速地新增、刪除、查詢通訊錄中

資料結構實現 6.4:優先佇列_基於連結串列實現(C++版)

資料結構實現 6.4:優先佇列_基於連結串列實現(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 入隊操作 2.2 出隊操作 2.3 查詢操作 2.4 其他操作 3. 演算法複雜度分析

資料結構實現 5.2:對映_基於連結串列實現(C++版)

資料結構實現 5.2:對映_基於連結串列實現(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 增加操作 2.2 刪除操作 2.3 修改操作 2.4 查詢操作 2.5 其他操作 3. 演

資料結構實現 4.2:集合_基於連結串列實現(C++版)

資料結構實現 4.2:集合_基於連結串列實現(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 增加操作 2.2 刪除操作 2.3 查詢操作 2.4 其他操作 3. 演算法複雜度分析

【Java原始碼】基於連結串列實現的LinkedList

    眾所周知,LinkedList是基於連結串列實現的。 目錄 基本屬性 構造方法 刪除元素 其他方法 迭代器 總結    基本屬性 transient int size = 0; transient Node<E> f

帶頭結點的連結串列實現通訊錄

關於連結串列使用二級指標或者一級指標引用的問題:      1、使用二級指標完全可以代替一級指標。在沒有頭結點的情況下必須使用二級指標,使用一級指標無效。      2、而如果不用二級指標,直接傳一個一級指標,相當於生成L的拷貝M,

JAVA基於陣列實現集合和基於連結串列實現集合

1.定義一個介面MyListpublic interface MyList { //增 void add(int num); //刪 boolean delete(int index2); //改 boolean update(int index2, int n

利用連結串列實現通訊錄

用連結串列實現一個可以用來儲存資訊的通訊錄,每個人的資訊包括:姓名、性別、年齡、電話、住址程式如下:#include<stdio.h> #include<string.h> #include<stdlib.h> #define LEN s

連結串列實現通訊錄程式設計

#include <stdio.h> #include <string.h> #include <stdlib.h> struct node             //定義連結串列 {char name[20];char phone_n

連結串列實現簡單的通訊錄功能

學習了連結串列後我用連結串列寫了一個簡單的通訊錄程式,主要能實現以下功能 使用連結串列實現增加(在增加人員的過程中有一個自動排序功能,比如按姓名排序)、刪除、修改、查詢的功能; (1)新增使用者資訊(號碼長度   號碼是否重複) (2)列出好友資訊(按姓名排序) (3)

連結串列實現功能強大的通訊錄

/***************************************************** copyright (C), Nanjing University of ZiJin File name:txl.c Author: CaoMengDe  Version:0.1    Date: 2

通訊錄連結串列實現,基本功能都有)

1、標頭檔案 #ifndef _LIST_H_ #define _LIST_H_ #include <stdio.h> #define FAILURE 1000 #define SUCCESS 1001 #define FALSE 1002 #define

c實現功能(13)實現單向連結串列的簡要功能

#include <stdio.h> #include <stdlib.h> //利用結構體建立節點 struct list{ //建立資料域 int data; //建立指標域 struct list *next; }; //實現建立一個

連結串列實現學生資訊表(含輸入、輸出、計算表長、查詢、插入、刪除等功能)

連結串列實現學生資訊表(含輸入、輸出、計算表長、查詢、插入、刪除等功能) #include <stdio.h> #include <stdlib.h> void menu() { printf("make your choice \n"); pr

基於連結串列的軟體定時器實現(轉)

軟體定時器在實際應用比較重要,本文旨在實現一種便於移植,易擴充套件功能,效率高的軟體定時器。本定時器是基於排序連結串列,將最近將觸發的定時器置於連結串列頭,後續新增定時器將計算出其合適位置插入。 主要資料結構及資料   typedef struct m_tm_tcb_struct { uint

Java棧(基於連結串列基於陣列實現

基於陣列實現 package com.ma.stack; /** * @author sunfch *此棧實現基於陣列,初始棧時已經設定棧大小 */ public class MyArrayStack { private int size; private int top = -1

模板容器類及迭代器的實現二(基於連結串列

節點類標頭檔案node.h: #ifndef MAIN_WTF_NODE1_H #define MAIN_WTF_NODE1_H #include <cstdlib> namespace main_wtf_6B {template<class Item>class

基於連結串列的容器類bag實現

連結串列類標頭檔案: #ifndef MAIN_WTF_NODE1_H #define MAIN_WTF_NODE1_H #include <cstdlib> namespace main_wtf_5 { class node { publi

基於有序連結串列實現的優先佇列

博主最近在苦讀演算法第四版,在第二章第四節的優先佇列的實現中,作者提到了可以用有序或無序連結串列實現優先佇列,博主在網上大致查閱了一下,好像沒有現成的java程式碼(泛型的),於是自己根據找到的程式碼簡單修改並實現了一下,特此記錄一下。 /*定義結點的抽象資料型別*/