基於 連結串列 實現通訊錄的功能
簡介
最近, 我編寫了一個程式,用於實現手機通訊錄的功能。
該程式基於 單向迴圈連結串列 , 實現了 新建聯絡人、(按編號、姓名、號碼)刪除聯絡人、(按編號、姓名、號碼)修改聯絡人、(按編號、姓名、號碼)查詢聯絡人、(按姓名、號碼排序)遍歷顯示聯絡人的功能, 並且在主程式中為其加入了操作介面的設計。
程式:
#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);
}
執行介面
心得
在寫通訊錄程式的過程中, 我獲益匪淺, 在此進行記錄。
首先, 我對連結串列的認識更加人深刻了, 對連結串列和指標的使用也更加熟悉了;在寫遍歷聯絡人(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程式碼(泛型的),於是自己根據找到的程式碼簡單修改並實現了一下,特此記錄一下。 /*定義結點的抽象資料型別*/