#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;
}
#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;
}