C语言示例八(Linuc C链表实现):写一个通讯录,可以实现添加、删除、查找、列表展示、修改等功能

函数声明

#ifndef LINK_H_
#define LINK_H_

typedef struct {	
	char username[10];
	char tel[11];
	struct Node *prev;
	struct Node *next;
}Node;

typedef struct {	
   int size;	   
   Node *head;
   Node *tail;
 }Link;

void addFirst(Link* lp,char username[10],char tel[11]); 

void addlast(Link* lp,char username[10],char tel[11]);

void travel(Link* lp);

char Find(Link* lp,char username[],char tel[]);

void sort(Link* lp);

Node* get(Link* lp,int index);

Node* getBuyUserName(Link* lp,char username[10]);

void removeUser(Link * list);

char Revise(Link* lp,char username[10]);

#endif

函数实现

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

void menu(){
	printf("|========= 1.Add    =========|\n");
	printf("|========= 2.Revise =========|\n");
	printf("|========= 3.Delete =========|\n");
	printf("|========= 4.List   =========|\n");
	printf("|========= 5.Find   =========|\n");
	printf("|========= 6.Exit   =========|\n");
}

void addFirst(Link * lp,char username[10],char tel[11]){
	printf("请输入用户名字:\n");
	scanf("%s",username);
	printf("请输入用户电话号码:\n");
	scanf("%s",tel);
	Node* ptr=(Node*)malloc(sizeof(Node));
	if(ptr == NULL){
		perror("malloc error!");
		exit(1);
	}
	strcpy(ptr->username,username);
	strcpy(ptr->tel,tel);
	if(lp->size == 0){
		lp->tail=ptr;
		}else{
			ptr->next=lp->head;
			lp->head->prev=ptr;
		}
	lp->head=ptr;
	lp->size++;
	printf("添加成功!\n");
}

void addLast(Link * lp,char username[10],char tel[11]){	
	Node* ptr=(Node*)malloc(sizeof(Node));
	if(ptr==NULL){
	perror("malloc error!");
	exit(1);
	}
	strcpy(ptr->username,username);
	strcpy(ptr->tel,tel);
	if(lp->size==0){
		lp->head=ptr;
	}else{
		lp->tail->next=ptr;
		ptr->prev=lp->tail;
	}
	lp->tail=ptr;
	lp->size++;
}

void travel(Link * lp){		
	printf(":=============\n");
	printf("size:%d\n",lp->size);
	Node * temp =lp->head;
	while(temp){
		printf("%x:%s:%s\n",temp,temp->username,temp->tel);
		temp=temp->next;
	}
	printf("\n=============;\n");
}

Node* get(Link* lp,int index){
		if(index<0 || index>lp->size-1){
			printf("index is invalid!%d\n",index);
			exit(1);
		}
		Node* np=lp->head;
		int i;
		for(i=0;i<index;i++){
			np=np->next;
		}
		return np;
}


Node* getByUserName(Link* lp,char username[]){
	Node* tp=lp->head;
	while(tp){
			if(strcmp(tp->username,username)==0){
				return tp;
			}
			tp=tp->next;
			}
			return NULL;
}


void removeUser(Link * list){
	char username[32];
	printf("please input delete name:");
	scanf("%s",username);
	Node * node = list->head;
	Node * pre = node;
	while(node){
		if(strcmp(node->username,username) == 0){
			if(node == list->head){
				Node * tmp = node;
				list->head = node->next;
				free(tmp);
				break;
			}
			Node * temp = node;
			pre->next = node->next;
			free(temp);
			break;
		}
		pre = node;
		node = node->next;
	}
	if(node == NULL){
		printf("No search this person\n");
		return;
	}
	else{
		printf("delete success\n");
		list->size--;
	}
}


char Find(Link* lp,char username[],char tel[]){
		Node* fp=lp->head;
		printf("请输入要查找的姓名\n");
		scanf("%s",username);
		int tmp = 0;
		int i;
		for(i=0;i<lp->size;i++){
			if(strcmp(fp->username,username)==0){
				printf("username:%s\n",fp->username);
				printf("tel:%s\n",fp->tel);
				printf("find successful!\n");
				tmp =1;
				break;
			}
			fp=fp->next;
		}
		if(tmp==0){
			printf("未找到\n");
		}
}

char Revise(Link* lp,char username[]){
	printf("请输入需要修改的名字:\n");
	scanf("%s",username);
	Node* rp=lp->head;
	char a[10];
	char b[10];
	int tmp = 0;
	int i;
	for(i=0;i<lp->size;i++){
		if(strcmp(rp->username,username)==0){
			printf("请输入修改后姓名:\n");
			scanf("%s",&a);
			strcpy(rp->username,a);
			printf("请输入修改后的电话号码:\n");
			scanf("%s",&b);
			strcpy(rp->tel,b);
			tmp =1;
			printf("Revise successful!\n");
			break;
			}
			rp=rp->next;
		}
		if(tmp==0){
		printf("没有该姓名\n");
		}
}

功能测试

#include<stdio.h>
#include<stdlib.h>
#include "link.h"

Link link ={0,NULL,NULL};

int main(int argc,char* argv){
	printf("  welcome to contest list:\n");
	char choise;
	char username[10];
	char tel[11];
	while(1){
		menu();
		scanf("%d",&choise);
		switch(choise){
		case 1:
			addFirst(&link,username,tel);
			break;
		case 2:
			Revise(&link,username);
			break;
		case 3:
			removeUser(&link);
			break;
		case 4:
			travel(&link);
			break;
		case 5:
			Find(&link,username,tel);
			break;
		case 6:
			printf("game over\n");
			exit(0);
		}
	}
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值