重温通讯录,链表尾插法

简介: 重温通讯录,链表尾插法

在培训班学习时,做的大作业,好像需要大学也会做,发出来给大家做个参考。

话不多说,上代码:

通讯录功能:

1,联系人数据:姓名,电话

2,可以增加联系人

3,查询联系人

4,删除联系人

5,修改联系人

6,遍历所有联系人

/*
*test.c
 *  Created on: Oct 31, 2020
 *      Author: Json
*/
#include <stdio.h>
#include<string.h>
//定义了一个联系人节点,包含联系人数据,还有下一个联系人节点的地址
typedef struct Contact{
  char name[50];
  char tel[11];
  struct Contact* next;
  struct Contact* prev;
}Contact;
//定义一个通讯录,包括
//链表定义1;有意个节点,较头节点,不存数据,只指向第一个节点
//链表定义2;有一个指针,指向第一个节点
typedef struct{
  int size;
  Contact* head;
  Contact* tail;
}ContactList;
//1.增加一个联系人
void add(ContactList* lp, Contact* cp) {
  //尾插发
  if (lp->size == 0) { //空表
    lp->head = cp;
  } else {
    lp->tail->next = cp;
    cp->prev = lp->tail; //维护prev指针
  }
  lp->tail = cp;
  lp->size++;
}
//2.查询联系人
Contact* find(ContactList*lp, char* name) {
  Contact* tp = lp->head;
  int size = lp->size;
  while (size--) {
    if (strcmp(name, tp->name) == 0) {
      return tp;
      break;
    }
    tp = tp->next;
  }
  return NULL;
}
//3.删除联系人
int remov(ContactList* lp, char* name) {
  Contact* tp = find(lp, name);
  if (tp == NULL) {
    return 0;
  }
  if (tp == lp->head) { //删除头节点
    lp->head = lp->head->next;
  } else if (tp == lp->tail) { //删除尾节点
    lp->tail = lp->tail->prev;
  } else {
    Contact* prev = tp->next;
    Contact* next = tp->prev;
    prev->next = next;
    next->prev = prev;
  }
  lp->size--;
  free(tp); //手动释放
  return 1;
}
//4.修改联系人
//1:success.0:fail
int modify(ContactList* lp, Contact* cp) {
  Contact* tp = find(lp, cp->name);
  if (tp == NULL) {
    return 0;
  }
  strcpy(tp->tel, cp->tel);
  return 1;
}
//5.遍历所有联系人
void trav(ContactList*lp) {
  int size = lp->size;
  printf(":--------------------------\n");
  printf("size = %d\n", size);
  Contact* tp = lp->head;
  while (size--) {
    printf("[addr=%x,%s,%s,next=%x] ", tp, tp->name, tp->tel, tp->next);
    tp = tp->next;
  }
  printf("\n--------------------------;\n");
}
int main() {
  ContactList list1; //创建第一个通讯录
  memset(&list1, 0, sizeof(list1));
  //ContactList list2; //创建第二个通讯录
  int choice;
  while (1) {
    printf("1.增加联系人 2.查询联系人 3.删除联系人 4.修改联系人 5.遍历所有联系人 0.结束\n");
    scanf(" %d", &choice);
    if (choice == 0) {
      printf("gave over!\n");
      break;
    }
    Contact* cp = malloc(sizeof(Contact)); //malloc返回一个地址
    if (cp == NULL) {
      printf(":malloc error!\n");
      exit(1);
    }
    switch (choice) {
    case 1:
      printf("请输入用户名:");
      scanf("%s", &cp->name);
      printf("请输入电话号码:");
      scanf("%s", &cp->tel);
      add(&list1, cp);
      break;
    case 2: {
      char name[50];
      printf("请输入用户名:");
      scanf("%s", name);
      Contact* tp = find(&list1, name);
      if (tp == NULL) {
        printf("no this man\n");
        break;
      }
      printf("电话号码:%s\n", tp->tel);
      break;
    }
    case 3: {
      char name[50];
      printf("请输入用户名:");
      scanf("%s", name);
      if (remov(&list1, name) == 0) {
        printf("no one\n");
        break;
      }
      printf("success!\n");
      break;
    }
      break;
    case 4: {
      Contact c;
      printf("请输入用户名:");
      scanf("%s", c.name);
      printf("请输入电话号码:");
      scanf("%s", c.tel);
      if (modify(&list1, &c) == 0) {
        printf("no one!\n");
      } else {
        printf("success!\n");
      }
      break;
    }
    case 5:
      trav(&list1);
      break;
    }
  }
}
目录
相关文章
|
2月前
|
算法
链表的头插法和尾插法
链表的头插法和尾插法
24 1
|
2月前
尾插法建立链表
尾插法建立链表
11 0
尾插法建立链表
链表遍历,链表查找和统计节点,链表插入新节点,链表删除节点,链表修改指定节点,链表头插法,尾插法总结
链表遍历,链表查找和统计节点,链表插入新节点,链表删除节点,链表修改指定节点,链表头插法,尾插法总结
|
2月前
|
存储
数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)
数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)
374 0
|
2月前
|
存储
数据结构基础:一篇文章教你单链表(头插,尾插,查找,头删等的解析和代码)
数据结构基础:一篇文章教你单链表(头插,尾插,查找,头删等的解析和代码)
数据结构|双向链表|带头结点|头插|尾插|尾删|头删
数据结构|双向链表|带头结点|头插|尾插|尾删|头删
|
2月前
|
存储 算法 C++
链表基础知识(二、双向链表头插、尾插、头删、尾删、查找、删除、插入)
链表基础知识(二、双向链表头插、尾插、头删、尾删、查找、删除、插入)
|
2月前
|
存储
链表基础知识(一、单链表、头插、尾插、头删、尾删、查找、删除、插入)
链表基础知识(一、单链表、头插、尾插、头删、尾删、查找、删除、插入)
|
2月前
|
存储
链表的学习:链表的头插法和尾插法以及HashMap中链表结点的插入方式
链表的学习:链表的头插法和尾插法以及HashMap中链表结点的插入方式 链表是一种常用的数据结构,它采用链式存储结构存储数据,相对于数组具有更灵活的操作和更高的效率。链表插入元素的方式有头插法和尾插法。
134 0
|
2月前
|
存储
数据结构:图文详解双向链表的各种操作(头插法,尾插法,任意位置插入,查询节点,删除节点,求链表的长度... ...)
数据结构:图文详解双向链表的各种操作(头插法,尾插法,任意位置插入,查询节点,删除节点,求链表的长度... ...)
437 0