sizeof(city_array) = 8, sizeof(char *) = 8


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/**
 * sizeof(city_array) = 8, sizeof(char *) = 8
 * count = sizeof(city_array) / sizeof(char *) = 1
 */
void print_city_array(int num, char **city_array){
	printf("sizeof(city_array) = %d, sizeof(char *) = %d\n", sizeof(city_array), sizeof(char *));
	printf("count = sizeof(city_array) / sizeof(char *) = %d\n", sizeof(city_array)/sizeof(char *));

	int i;
	for(i = 0; i < num; i++){
		puts(city_array[i]);
	}
}
/**
 * ==:sizeof(array) = 8, sizeof(int *) = 8, sizeof(array)/sizeof(int) = 2
 */
int get_total(int sum, int *array){
	printf("==:sizeof(array) = %d, sizeof(int *) = %d, sizeof(array)/sizeof(int) = %d\n",
			sizeof(array), sizeof(int *), sizeof(array)/sizeof(int) );

	int i, total = 0;
	for(i = 0; i < sum; i++)
		total += array[i];
	return total;
}

int main(int argc, char *argv[]) {
	char *city_array[] = {
			"beijing",
			"shanghai",
			"wuhan",
			"xian"
	};

	puts("==========main starting========");
	printf("sizeof(city_array) = %d, sizeof(char *) = %d\n", sizeof(city_array), sizeof(char *));
	printf("count = sizeof(city_array) / sizeof(char *) = %d\n", sizeof(city_array)/sizeof(char *));

	int i;
	for(i = 0; i < sizeof(city_array)/sizeof(char *); i++){
		puts(city_array[i]);
	}
	puts("==========main ending========");
	print_city_array(4, city_array);

	int array[] = {1, 9, 2, 8, 3, 7, 4, 6, 5};
	int total = get_total(9, array);
	printf("total = %d\n", total);
	return 0;
}



#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 同学信息结构体 typedef struct Student { char name[50]; char gender; char phone[15]; char email[50]; char city[50]; struct Student* next; } Student; // 全局链表头指针 Student* head = NULL; // 创建新同学节点 Student* create_student() { Student* new_student = (Student*)malloc(sizeof(Student)); if (new_student == NULL) { printf("内存分配失败\n"); return NULL; } printf("请输入姓名: "); scanf("%s", new_student->name); printf("请输入性别(M/F): "); scanf(" %c", &new_student->gender); printf("请输入电话号码: "); scanf("%s", new_student->phone); printf("请输入邮箱: "); scanf("%s", new_student->email); printf("请输入所在城市: "); scanf("%s", new_student->city); new_student->next = NULL; return new_student; } // 添加同学到通讯录 void add_student() { Student* new_student = create_student(); if (new_student == NULL) return; if (head == NULL) { head = new_student; } else { Student* temp = head; while (temp->next != NULL) { temp = temp->next; } temp->next = new_student; } printf("同学信息添加成功!\n"); } // 删除同学信息 void delete_student(const char* name) { if (head == NULL) { printf("通讯录为空!\n"); return; } Student* current = head; Student* previous = NULL; while (current != NULL) { if (strcmp(current->name, name) == 0) { if (previous == NULL) { head = current->next; } else { previous->next = current->next; } free(current); printf("删除成功!\n"); return; } previous = current; current = current->next; } printf("未找到该同学: %s\n", name); } // 修改同学信息 void update_student(const char* name) { Student* current = head; while (current != NULL) { if (strcmp(current->name, name) == 0) { printf("请输入新的电话号码: "); scanf("%s", current->phone); printf("请输入新的邮箱: "); scanf("%s", current->email); printf("请输入新的所在城市: "); scanf("%s", current->city); printf("信息更新成功!\n"); return; } current = current->next; } printf("未找到该同学: %s\n", name); } // 打印同学信息 void print_student(Student* student) { printf("姓名: %-15s 性别: %c 电话: %-15s 邮箱: %-20s 城市: %s\n", student->name, student->gender, student->phone, student->email, student->city); } // 按姓名查询(线性查找) Student* search_by_name(const char* name) { Student* current = head; while (current != NULL) { if (strcmp(current->name, name) == 0) { return current; } current = current->next; } return NULL; } // 按城市查询 void search_by_city(const char* city) { Student* current = head; int found = 0; printf("\n--- 在 %s 的同学 ---\n", city); while (current != NULL) { if (strcmp(current->city, city) == 0) { print_student(current); found = 1; } current = current->next; } if (!found) { printf("未找到该城市的同学\n"); } } // 折半查找辅助函数(将链表转为数组) int convert_list_to_array(Student*** array) { int count = 0; Student* current = head; // 计算链表长度 while (current != NULL) { count++; current = current->next; } if (count == 0) return 0; // 分配数组内存 *array = (Student**)malloc(count * sizeof(Student*)); if (*array == NULL) { printf("内存分配失败\n"); return 0; } // 填充数组 current = head; for (int i = 0; i < count; i++) { (*array)[i] = current; current = current->next; } return count; } // 按姓名折半查找 void binary_search_by_name(const char* name) { Student** array = NULL; int count = convert_list_to_array(&array); if (count == 0) { printf("通讯录为空!\n"); return; } // 折半查找 int left = 0, right = count - 1; while (left <= right) { int mid = left + (right - left) / 2; int cmp = strcmp(array[mid]->name, name); if (cmp == 0) { printf("\n找到同学:\n"); print_student(array[mid]); free(array); return; } else if (cmp < 0) { left = mid + 1; } else { right = mid - 1; } } printf("未找到该同学: %s\n", name); free(array); } // 冒泡排序按姓名 void bubble_sort_by_name() { if (head == NULL || head->next == NULL) return; int swapped; Student* ptr1; Student* lptr = NULL; do { swapped = 0; ptr1 = head; while (ptr1->next != lptr) { if (strcmp(ptr1->name, ptr1->next->name) > 0) { // 交换节点数据(实际应用中应交换节点指针) Student temp = *ptr1; *ptr1 = *(ptr1->next); *(ptr1->next) = temp; // 保持next指针正确 temp.next = ptr1->next; ptr1->next = temp.next; ptr1->next->next = temp.next->next; swapped = 1; } ptr1 = ptr1->next; } lptr = ptr1; } while (swapped); printf("已按姓名排序!\n"); } // 显示所有同学 void display_all() { if (head == NULL) { printf("通讯录为空!\n"); return; } printf("\n--- 所有同学信息 ---\n"); Student* current = head; while (current != NULL) { print_student(current); current = current->next; } } // 释放链表内存 void free_list() { Student* current = head; while (current != NULL) { Student* next = current->next; free(current); current = next; } head = NULL; } // 主菜单 int main() { int choice; char name[50], city[50]; while (1) { printf("\n=== 同学通讯录管理系统 ===\n"); printf("1. 添加同学信息\n"); printf("2. 删除同学信息\n"); printf("3. 修改同学信息\n"); printf("4. 按姓名查询(线性查找)\n"); printf("5. 按城市查询\n"); printf("6. 按姓名查询(折半查找)\n"); printf("7. 按姓名排序(冒泡排序)\n"); printf("8. 显示所有同学\n"); printf("9. 退出系统\n"); printf("请选择操作: "); scanf("%d", &choice); switch (choice) { case 1: {add_student(); break;} case 2: {printf("请输入要删除的同学姓名: "); scanf("%s", name); delete_student(name); break;} case 3: {printf("请输入要修改的同学姓名: "); scanf("%s", name); update_student(name); break;} case 4: {printf("请输入要查询的同学姓名: "); scanf("%s", name); Student* result = search_by_name(name); if (result != NULL) { printf("\n找到同学:\n"); print_student(result); } else { printf("未找到该同学\n"); } break;} case 5: {printf("请输入要查询的城市: "); scanf("%s", city); search_by_city(city); break;} case 6: {printf("请输入要查询的同学姓名: "); scanf("%s", name); binary_search_by_name(name); break;} case 7: {bubble_sort_by_name(); break;} case 8: {display_all(); break;} case 9: {free_list(); printf("系统已退出!\n"); exit(0);} default: {printf("无效选择,请重新输入!\n");} } } return 0; } 增加这里的按同学姓名排序的排序方法功能,并按照上述格式填入其中,输出完整代码
06-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值