C语言(在linex系统操作)通讯录

来源:互联网 发布:丑老太婆网络照片 编辑:程序博客网 时间:2024/06/07 00:18

C语言(Linux)通讯录

、通讯录功能说明

1、添加联系人

2、删除联系人

3、查找联系人

4、排序(姓名、编号插入排序)

5、查看所有联系人

6、排序(堆排序、快速排序)

7、更新联系人

8、退出

二、功能要求

1、使用链表、结构体;

2、排序使用插入排序;

3、要有文件读入和读出;

4、一个联系人要有三个号码

三、设计思路

因为要用到链表,和结构体所以采用双结构体。

一个结构体重要工作是:功能实现

另一个总要的元素值的操控。

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;//指向上一个节点

};

链表采用的是双向循环链表,可以对上一个和下一个接点操作,有助于插入排序;

在本程序采用头插的方式进行链表的新建

头插原理:

Head(头结点)->结点1->结点2...

现在想新建一个结点并插在头结点后面;

Head(头结点)->新结点->结点1->结点2...

 

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 paixu(type *p)//按照姓名的插入排序

{

type2 *temp;

type *q = p;

type *t_1 = p;

int i;

int j;

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;

}

}

堆排序和快速排序方法是有一定技巧

实现先将每一个链表的值赋给一个数组,对数组排序就简单了,再将排好的数组赋给每个链表结点。

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;

type2 a[1024];

int i = 0;

while(q -> next != p)

{

        a[i] = *(q -> next -> somebody);//将链表数组化

        i ++;

        q = q -> next;

}

type2 b[i];

int len = i;

for(i = 0;i < len;i++)

{

b[i] = a[i];

}

    quicksort(b,0,len-1);//对数组进行快速排序

    printf("序号\t姓名 \t手机号\t\t公司号码\t家庭号码\n");

    for(i = 0;i < len;i++)

{

     printf("%3d\t",b[i].order );

printf("%s",b[i].name);

printf(" \t%s",b[i].number);

printf("     %s",b[i].company_number);

printf("    %s\n",b[i].family_number);

    *(p -> next -> somebody) = b[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;

type2 a[1024];

int i = 0;

while(q -> next != p)

{

        a[i] = *(q -> next -> somebody);

        i ++;

        q = q -> next;

}

type2 b[i];

int len = i;

for(i = 0;i < len;i++)

{

b[i] = a[i];

}

    heap(b,len);//调用堆排序函数

    printf("序号\t姓名 \t手机号\t\t公司号码\t家庭号码\n");

    for(i = 0;i < len;i++)

{

     printf("%3d\t",b[i].order );

printf("%s",b[i].name);

printf(" \t%s",b[i].number);

printf("     %s",b[i].company_number);

printf("    %s\n",b[i].family_number);

    *(p -> next -> somebody) = b[i];

        p = p -> next;

}

printf("\n");

}

 

文件的读入、读出:

文件读入很容易,文件读出有点绕弯,文件读出就相当于将文件的内容赋给链表,简单的讲就是新建链表进行头插;

void fscanf0(type *p)

{

    FILE *fp = fopen("./address_list.txt","a+");

    if (fp == NULL)

    {

     perror("fopen");

     exit(1);

    }

    int i = 0;

    char buffer[5][1024] = {0};

    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);

}

全部程序:

 #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)//输入函数
{
type2 *q=(type2 *)malloc(sizeof(type2));
*p=q;
int i;
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;
}
}*/
scanf("%s",q->company_number);
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;
}
}*/
scanf("%s",q->family_number);
return 1;

}


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


fp=fopen("./address_list.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)
{
    FILE *fp = fopen("./address_list.txt","a+");
    if (fp == NULL)
    {
    perror("fopen");
    exit(1);
    }
    int i = 0;
    char buffer[5][1024] = {0};
    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
{
int i;
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
{
printf("序号\t姓名\t手机号\t\t公司号码\t家庭号码\n");
type *q = p;
while(q!=p->next)
{
print2(p->next->somebody);
p=p->next;
}
}


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


}


int delete_value(type *p)//按照名字值删除
{
char a[20] = {0};
printf("请输入删除的姓名\n");
scanf("%s",a);
int i=0;
type *q=p;
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 ;
printf("请输入删除的编号\n");
scanf("%d",&a);
int i=0;
type *q=p;
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};
printf("请输入删除的手机号\n");
scanf("%s",a);
int i=0;
type *q=p;
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;


    }
}


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;


    }
}


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;


    }
}






void paixu(type *p)//按照姓名的插入排序
{
type2 *temp;
type *q = p;
type *t_1 = p;
int i;
int j;
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;
int i;
int j;
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;
type2 a[1024];
int i = 0;
while(q -> next != p)
{
        a[i] = *(q -> next -> somebody);//将链表数组化
        i ++;
        q = q -> next;
}
type2 b[i];
int len = i;
for(i = 0;i < len;i++)
{
b[i] = a[i];
}
    quicksort(b,0,len-1);//对数组进行快速排序
    printf("序号\t姓名 \t手机号\t\t公司号码\t家庭号码\n");
    for(i = 0;i < len;i++)
{
    printf("%3d\t",b[i].order );
printf("%s",b[i].name);
printf(" \t%s",b[i].number);
printf("     %s",b[i].company_number);
printf("    %s\n",b[i].family_number);
   *(p -> next -> somebody) = b[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;
type2 a[1024];
int i = 0;
while(q -> next != p)
{
        a[i] = *(q -> next -> somebody);
        i ++;
        q = q -> next;
}
type2 b[i];
int len = i;
for(i = 0;i < len;i++)
{
b[i] = a[i];
}
    heap(b,len);//调用堆排序函数
    printf("序号\t姓名 \t手机号\t\t公司号码\t家庭号码\n");
    for(i = 0;i < len;i++)
{
    printf("%3d\t",b[i].order );
printf("%s",b[i].name);
printf(" \t%s",b[i].number);
printf("     %s",b[i].company_number);
printf("    %s\n",b[i].family_number);
   *(p -> next -> somebody) = b[i];
        p = p -> next;
}
printf("\n");
}


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


inint(&head);


type *q=head;
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(head,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;
}


原创粉丝点击