| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 442 人关注过本帖
标题:这个通讯录的代码为什么不能实现删除
取消只看楼主 加入收藏
任同亚
Rank: 1
等 级:新手上路
帖 子:2
专家分:3
注 册:2011-12-21
收藏
 问题点数:0 回复次数:0 
这个通讯录的代码为什么不能实现删除
求大家帮我看看这个链表通讯录的代码为什么不能实现删除,万分感谢!!

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
typedef struct abc{ //通讯录结点类型
  char sno[20]; //学号
  char name[20]; //姓名
  char sex[20]; //性别
  char phone[20]; //电话
  char addr[50]; //地址
} DataType;
typedef struct node { //结点类型定义
  DataType data; //结点数据域
  struct node *next; //结点指针域
} ListNode;
typedef ListNode *LinkList;
LinkList head;
ListNode *p;
//函数说明
int menu_select();
LinkList CreateList(void);
void InsertNode(LinkList head,ListNode *p);
ListNode *ListFind(LinkList head);
void DelNode(LinkList head);
void PrintList(LinkList head);

//主函数
void main()

{
        color();
  for( ; ; ){
switch(menu_select( ) )
{
  case 1:
  printf("\n");
  printf("*建立通讯录*\n \n");
  head=CreateList( );
  break;
  case 2:
  printf("\n");
  printf("*插入通讯记录*\n\n ");
  printf("学号  姓名  性别  电话  地址 \n\n ");
  p=(ListNode *)malloc(sizeof(ListNode)); //申请新结点
  scanf("%s%s%s%s%s",p->data.sno,p->data.name,p->data.sex,
  p->data.phone,p->data.addr);
  InsertNode(head,p);
  break;
  case 3:
  printf("\n");
  printf("*查询通讯记录*\n\n ");
  p=ListFind(head);
  if (p!=NULL) {
  printf("学号  姓名  性别  联系电话  地址 \n\n ");
  printf("%s,%s,%s,%s,%s\n",p->data.sno,p->data.name,
  p->data.sex,p->data.phone,p->data.addr);
  printf("\n");
  }
  else
  printf("没有查到要查询的通讯者!\n");
  break;
  case 4:
  printf("\n");
  printf("*删除通讯记录*\n\n ");
  DelNode(head); //删除结点
  break;
  case 5:
  printf("\n");
  printf("*显示通讯录*\n");
  printf("************************************\n");
  PrintList(head);
  break;
  case 0:
  printf("\t 再 见! \n");
  return;
  }
  }
}



int menu_select( )
{
  int sn;
  printf(" 通讯录管理系统 \n");
  printf(" 1.建立通讯录\n");
  printf(" 2.插入通讯记录\n");
  printf(" 3.查询通讯记录\n");
  printf(" 4.删除通讯记录\n");
  printf(" 5.显示通讯录\n");
  printf(" 0.退出管理系统\n");
  printf(" 请 选 择 0-5: ");
  for( ;; )
  {
  scanf("%d",&sn);
  if (sn<0||sn>5)
  printf("\n\t输入错误,重选0-5:");
  else
  break;
  }
  return sn;
}

LinkList CreateList(void){ //尾插法建立带头结点的通讯录链表算法
LinkList head=(ListNode *)malloc(sizeof(ListNode)); //申请头结点
ListNode *p,*rear;
int flag=0; //结束标志置0
rear=head; //尾指针初始指向头结点
while (flag==0){
p=(ListNode *)malloc(sizeof(ListNode)); //申新结点
printf("学号  姓名  性别  电话  地址 \n\n ");
scanf("%s%s%s%s%s",p->data.sno,p->data.name,p->data.sex,p->data.phone,
  p->data.addr);
rear->next=p; //新结点连接到尾结点之后
rear=p; //尾指针指向新结点
printf("结束建表吗?(1/0):");
scanf("%d",&flag);
}
rear->next=NULL; //终端结点指针置空
return head; //返回链表头指针
}



void InsertNode(LinkList head,ListNode *p)
{
  ListNode *p1,*p2;
  p1=head;
  p2=p1->next;
  while(p2!=NULL && strcmp(p2->data.sno,p->data.sno)<0)
  {
  p1=p2; //p1指向刚访问过的结点
  p2=p2->next; //p2指向表的下一个结点
  }
  p1->next=p; //插入p所指向的结点
  p->next=p2; //连接表中剩余的结点
}



ListNode *ListFind(LinkList head)
{// 有序通讯录链表上的查找
  ListNode *p;
  char sno[5];
  char name[9];
  int xz;
  printf("==================\n");
  printf(" 1. 按学号查询 \n");
  printf(" 2. 按姓名查询 \n");
  printf("==================\n");
  printf(" 请选择: ");
  p=head->next; //假定通讯 录表带头结点
  scanf("%d",&xz);
  if (xz==1) {
  printf("请输入要查找者的学号:");
  scanf("%s",sno);
  while (p&&strcmp(p->data.sno,sno)<0)
  p=p->next;
  if ((p==NULL)||strcmp(p->data.sno,sno)>0)
  p=NULL; //没有查到要查找的通讯
}
else
  if (xz==2) {
  printf(" 请输入要查找者的姓名:");
  scanf("%s",name);
  while(p&&strcmp(p->data.name,name)!=0)
  p=p->next;
  }
  return p;
}



void DelNode(LinkList head)
{
  char jx;
  ListNode *p,*q;   
  p=ListFind(head); //调用查找函数
  if (p==NULL) {
  printf("没有查到要删除的通讯者!\n");
  return;
  }
  printf("真的要删除该结点吗?(y/n):");
  scanf("%c",&jx);
  if (jx=='y'||jx=='Y') {
  q=head;
  while ((q!=NULL) &&(q->next!=p))
  q=q->next;
  q->next=p->next; //删除结点
  free(p); //释放被删结点空间
  printf("通讯者已被删除!\n");
  }
}

void PrintList(LinkList head)
{
ListNode *p;
p=head->next;
printf("学号  姓名  性别  联系电话  地址 \n\n ");
while (p!=NULL)
{
  printf("%s,%s,%s,%s,%s\n",p->data.sno,p->data.name,p->data.sex,
  p->data.phone,p->data.addr);
  printf("\n");
  p=p->next; //后移一个结点
}
}
int color()
{
    system("color 47");//调用system("color ab"),改变dos框背景及字体颜色;
    return 0;
}
下图是通讯记录
[local]2[/local]

但是删除就变这样了,
[local]1[/local]
就跳转了

[ 本帖最后由 任同亚 于 2011-12-21 12:36 编辑 ]
搜索更多相关主题的帖子: 电话 姓名 include 通讯录 
2011-12-21 12:34
快速回复:这个通讯录的代码为什么不能实现删除
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037790 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved