C语言(window)通讯录程序

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


#define t 1
#define f 0


typedef struct message type2;
typedef struct node type;


struct message
{
int  order;//编号
char name[20];//姓名
char number[20];//手机号
char company_number[20];//公司电话
char family_number[20];//家庭电话
};


struct node//双向循环链表
{
struct message *somebody;
struct node *next;//指向下一个节点
struct node *up;//指向上一个节点
};


int shuru(type2 **p)//输入函数
{
int i;
type2 *q=(type2 *)malloc(sizeof(type2));
*p=q;


printf("请输入要存的姓名的编号:\n");
scanf("%d",&(q->order));
printf("请输入要存的姓名:\n");
scanf("%s",q->name);
getchar();
printf("请输入要存手机号:\n");
for (i = 0; i < 20; ++i)
{
scanf("%c",(q->number+i));
if (q -> number[0] == '\n')
{
printf("error\n");
return 0;
}
if (q -> number[i] == '\n')
{
q -> number[i] = '\0';
break;
}
}
printf("请输入要存公司号:\n");
for (i = 0; i < 20; ++i)
{
scanf("%c",(q->company_number+i));
if (q -> company_number[i] == '\n')
{
q -> company_number[i] = '\0';
break;
}
}
printf("请输入要存座机号:\n");
for (i = 0; i < 20; ++i)
{
scanf("%c",(q->family_number+i));
if (q -> family_number[i] == '\n')
{
q -> family_number[i] = '\0';
break;
}
}
return 1;

}


void fprint0(type *p)//输入到文件
{
FILE *fp;
type *q = p;


fp=fopen("E:\\1.txt","w+");
fprintf(fp,"序号\t姓名\t手机号\t公司号码\t家庭号码\n");
while(q!=p->next)
{
fprintf(fp,"%3d\t", p -> next -> somebody -> order);
fprintf(fp,"%s",p->next->somebody->name);
fprintf(fp," \t%s",p->next->somebody->number);
fprintf(fp,"     %s",p->next->somebody->company_number);
fprintf(fp,"    %s",p->next->somebody->family_number);
fprintf(fp,"\n");
p=p->next;

   
}
fclose(fp);
}


int inint(type **p)//链表初始化
{
    type *newnode=(type *)malloc(sizeof(type));
    if (NULL==newnode)
    {
    return f;
    }
    *p=newnode;
    newnode->up=newnode;
    newnode->next=newnode;
    return t;
}


int index_head(type *p, type2 *somebody)//链表的头插
{

type *newnode=(type *)malloc(sizeof(type));
if(NULL == newnode)
{
printf("error\n");
return f;
}


(newnode->somebody)=somebody;
newnode->next=p->next;
p->next=newnode;
newnode->up=p;
newnode->next->up=newnode;

return t;


}


void fscanf0(type *p)
{
char buffer[5][1024] = {0};
    FILE *fp = fopen("E:\\1.txt","r+");
    if (fp == NULL)
    {
    perror("fopen");
    exit(1);
    }
    
    
    fscanf(fp,"%s\t%s\t%s\t%s\t%s",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4]);
    memset(buffer,0,5120);
    while(1)
{
struct message *somebody = (struct message *)malloc(sizeof(struct message));
   fscanf(fp,"%3d\t",&(somebody -> order));
  fscanf(fp,"%s",somebody->name);
  fscanf(fp," \t%s",somebody->number);
  fscanf(fp,"     %s",somebody->company_number);
  fscanf(fp,"    %s",somebody->family_number);
  if (somebody -> name[0] == '\0')
  {
  break;
  }
  index_head(p,somebody);
  somebody = NULL;
   }
   fclose(fp);
}


void print2(type2 *p)//输出函数2
{
printf("%3d\t",p->order );
printf("%s",p->name);
printf(" \t%s",p->number);
printf("     %s",p -> company_number);
printf("    %s\n", p -> family_number);
}


void print1(type *p)//输出函数1
{

type *q = p;
printf("序号\t姓名\t手机号\t\t公司号码\t家庭号码\n");

while(q!=p->next)
{
print2(p->next->somebody);
p=p->next;
}
}


int delete_local(type *p,int local)//按位置删除
{
int i;
type *temp;
for(i=0;i<local;i++)
{
p=p->next;
}
temp=p->next;
    p->next = temp->next;
    free(temp);
    return t;


}


int delete_value(type *p)//按照名字值删除
{
char a[20] = {0};
int i=0;
type *q=p;
printf("请输入删除的姓名\n");
scanf("%s",a);

while(q!=p->next)
{
if (strcmp(p->next->somebody->name,a)==0)
{
delete_local(q,i);
}
else
{
p=p->next;
i++;
}
}
    return t;


}


int delete_order(type *p)//按照编号删除
{
int a ;
int i=0;
type *q=p;
printf("请输入删除的编号\n");
scanf("%d",&a);

while(q!=p->next)
{
if (p->next->somebody->order == a )
{
delete_local(q,i);
}
else
{
p=p->next;
i++;
}
}
    return t;


}


int delete_number(type *p)//按照手机删除
{
char a[20] = {0};
int i=0;
type *q=p;
printf("请输入删除的手机号\n");
scanf("%s",a);

while(q!=p->next)
{
if (strcmp(p->next->somebody->number,a)==0)
{
delete_local(q,i);
}
else
{
p=p->next;
i++;
}
}
    return t;


}


int find_name(type *p)//按照姓名查询
{
char a[20] = {0};
int i=0;
type *q = p;
    printf("请输入要拨打的姓名:\n");
    scanf("%s",a);
    while(a[i]!='\0')
    {
    i++;
    }
    while(p->next != q)
    {
    if (strncmp(p->next->somebody->name,a,i)==0)
    {
    printf("序号\t姓名 \t手机号\t\t公司号码\t家庭号码\n");
    printf("%3d\t",p -> next -> somebody -> order );
printf("%s",p -> next -> somebody -> name);
printf(" \t%s",p -> next -> somebody -> number);
printf("     %s",p -> next -> somebody -> company_number);
printf("    %s\n", p -> next -> somebody -> family_number);
    }
    p=p->next;


    }
    return 1;
}


int find_order(type *p)//按照编号查询
{
int i=0;
int a;
type *q = p;
    printf("请输入要拨打的编号:\n");
    scanf("%d",&a);
    while(p->next != q)
    {
    if (p->next->somebody->order == a)
    {
    printf("序号\t姓名 \t手机号\t\t公司号码\t家庭号码\n");
    printf("%3d\t",p -> next -> somebody -> order );
printf("%s",p -> next -> somebody -> name);
printf(" \t%s",p -> next -> somebody -> number);
printf("     %s",p -> next -> somebody -> company_number);
printf("    %s\n", p -> next -> somebody -> family_number);
    }
    p=p->next;


    }
    return 1;
}


int find_number(type *p)//按照号码查询
{
int i=0;
char a[20] = {0};
type *q = p;
    printf("请输入要查询的号码:\n");
    scanf("%s",a);
    while(a[i]!='\0')
    {
    i++;
    }
    getchar();
    while(p->next != q)
    {
    if (strncmp(p->next->somebody->name,a,i)==0)
    {
    printf("序号\t姓名 \t手机号\t\t公司号码\t家庭号码\n");
    printf("%3d\t",p -> next -> somebody -> order );
printf("%s",p -> next -> somebody -> name);
printf(" \t%s",p -> next -> somebody -> number);
printf("     %s",p -> next -> somebody -> company_number);
printf("    %s\n", p -> next -> somebody -> family_number);
    }
    p=p->next;


    }
    return 1;
}






void paixu(type *p)//按照姓名的插入排序
{
type2 *temp;
type *q = p;
type *t_1 = p;
p = p  -> next;
t_1 = t_1 -> next ;
while(p ->next != q)
{

temp = p -> next -> somebody;
if (strcmp(p->somebody->name,p->next->somebody->name)==1)
{
while(p  != q  )
{
if (strcmp(p->somebody->name,temp -> name)==1)
{
p -> next -> somebody = p -> somebody;
}
else
{
break;
}
p = p -> up;
}
p -> next -> somebody = temp;
}
t_1 = t_1 -> next ;
p = t_1;
}
}


void paixu_order(type *p)//按照编号的插入排序
{
type2 *temp;
type *q = p;
type *t_1 = p;
p = p  -> next;
t_1 = t_1 -> next ;
while(p ->next != q)
{

temp = p -> next -> somebody;
if (p->somebody->order >= p->next->somebody->order)
{
while(p  != q  )
{
if (p -> somebody -> order >= temp -> order)
{
p -> next -> somebody = p -> somebody;
}
else
{
break;
}
p = p -> up;
}
p -> next -> somebody = temp;
}
t_1 = t_1 -> next ;
p = t_1;
}
}






int length(type *p)//测试链表长度,没有什么用
{
int i=0;
type *q = p;
while(q!=p->next)
{
p=p->next;
i++;
}
return i;
}


void update_name(type *p)//按照姓名更新
{
char a[20] = {0};
int m ;
int i=0;
type *q = p;
    printf("请输入要更新的姓名:\n");
    scanf("%s",a);
    while(a[i]!='\0')
    {
    i++;
    }
    while(p->next != q)
    {
    if (strncmp(p->next->somebody->name,a,i)==0)
    {
    printf("请输入新的编号:\n");
    scanf("%d",&m);
    p -> next -> somebody -> order = m;
    memset(a,0,20);
    printf("请输入新的名字:\n");
    scanf("%s",a);
strcpy(p -> next -> somebody -> name,a);
printf("请输入新的手机号:\n");
memset(a,0,20);
    scanf("%s",a);
strcpy(p -> next -> somebody -> number,a);
printf("请输入新的公司号:\n");
memset(a,0,20);
    scanf("%s",a);
strcpy(p -> next -> somebody -> company_number,a);
printf("请输入新的座机号:\n");
memset(a,0,20);
    scanf("%s",a);
strcpy(p -> next -> somebody -> family_number,a);
break;


    }
    p=p->next;


    }


}




int pivotkey1(type2 arr[],int low,int high)
{
int pivot = arr[low].order;
type2 temp = arr[low];


while(low < high)
{
while(low<high && arr[high].order>=pivot)
high--;
arr[low] = arr[high];
while(low<high && arr[low].order <= pivot)
low++;
arr[high] = arr[low];
}
arr[low].order = pivot;
arr[low] = temp;
return low;
}


void quicksort(type2 arr[],int low,int high)
{
if(low < high)
{
int pivotkey = pivotkey1(arr,low,high);
quicksort(arr,low,pivotkey-1);
quicksort(arr,pivotkey+1,high);
}
}


void quick(type *p)//快速排序
{
type *q = p;
int i = 0;
int len;
type2 a[1024];

while(q -> next != p)
{
        a[i] = *(q -> next -> somebody);//将链表数组化
        i ++;
        q = q -> next;
}
len = i;
    quicksort(a,0,len-1);//对数组进行快速排序
    printf("序号\t姓名 \t手机号\t\t公司号码\t家庭号码\n");
    for(i = 0;i < len;i++)
{
    printf("%3d\t",a[i].order );
printf("%s",a[i].name);
printf(" \t%s",a[i].number);
printf("     %s",a[i].company_number);
printf("    %s\n",a[i].family_number);
   *(p -> next -> somebody) = a[i];
        p = p -> next;
}
printf("\n");
}


void heapadjust(type2 arr[],int n,int m)
{
int i;
int temp = arr[n].order;
type2 temp_1 = arr[n];
    for(i=2*n+1;i <= m;i = 2*i+1)
    {
    if(i < m && arr[i].order < arr[i+1].order)
    i++;
    if(arr[i].order < temp)
    break;
    arr[n] = arr[i];
    n = i;
    }
    arr[n].order = temp;
    arr[n] = temp_1;


}


void heap(type2 arr[],int len)
{
int i;
type2 temp ;
for(i = (len-2)/2;i>=0;i--)
{
heapadjust(arr,i,len-1);
}
for(i = len-1;i >= 0;i--)
{
temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
heapadjust(arr,0,i-1);
}
}


void stack(type *p)//堆排序数组化
{
type *q = p;
int i = 0;
int len;
type2 a[1024];

while(q -> next != p)
{
        a[i] = *(q -> next -> somebody);//将链表数组化
        i ++;
        q = q -> next;
}
len = i;
    heap(a,len);//调用堆排序函数
    printf("序号\t姓名 \t手机号\t\t公司号码\t家庭号码\n");
    for(i = 0;i < len;i++)
{
    printf("%3d\t",a[i].order );
printf("%s",a[i].name);
printf(" \t%s",a[i].number);
printf("     %s",a[i].company_number);
printf("    %s\n",a[i].family_number);
   *(p -> next -> somebody) = a[i];
        p = p -> next;
}
printf("\n");
}


int main()
{
type *q;
int m = 0 ;
int n;
int i;
int j=0;
//type *q=head;
char a[4]={'\0'};
char b[4]={'\0'};
type2 *somebody;


//inint(&head);
inint(&q);
//fscanf0(q);


do
{
printf("****************************************\n");
        printf("*           请输入以下编号             *\n");
        printf("****************************************\n");
        printf("*   1.添加联系人     *   2.删除联系人  *\n");
        printf("*   3.查找联系人     *   4.排序(姓名)*\n");
        printf("*   5.查看所有联系人 *   6.排序(快速)*\n");
        printf("*   7.更新联系人     *   8.排序(堆)  *\n");
        printf("****************************************\n");
        printf("*                9.退出                *\n");
        printf("****************************************\n");
        scanf("%d",&i);
        switch(i)
        {
        case 1:
             n = shuru(&somebody);//当第一个手机号没有输入就break,不需要头插;
             if (n == 0)
             {
              break;
             }
             index_head(q,somebody);
             break;
        case 2:
             printf("请输入删除的属性编号\n");
             printf("1、编号  2、姓名  3、手机号\n");
             scanf("%d",&m);
             switch(m)
             {
                      case 1:
                             delete_order(q);
                             break;
                      case 2:
                             delete_value(q);
                             break;
                      case 3:
                             delete_number(q);
                             break;
                      default :
                             printf("error\n");
                             break;
             }
         break;
            case 3:
                  printf("请输入查询的属性编号\n");
             printf("1、编号  2、姓名  3、手机号\n");
             scanf("%d",&m);
             switch(m)
             {
                      case 1:
                             find_order(q);
                             break;
                      case 2:
                             find_name(q);
                             break;
                      case 3:
                             find_number(q);
                             break;
                      default :
                             printf("error\n");
                             break;
             }
         break;
            case 4:
                  paixu(q);
                  break;
            case 5:
             print1(q);
                  break;
            case 6:
                  quick(q);
                  break;
            case 7:
                  update_name(q);
                  break;
            case 8:
                  stack(q);
                  break;
            case 9:
                  j++;
                  break;
            default:printf("error\n");
                    break;
        }
        if (j!=0)
        {
        break;
        }
getchar();
}while(1);
fprint0(q);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值