C语言作业

C语言作业

1、顺序表

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define MaxSize 20


typedef struct{
    char name[10];		// 姓名
    int age;			// 年龄
    char skill[10];		// 技能
}Person;	// 人物结构


typedef struct{
    Person per[MaxSize];		// 表示一个人
    int length;					// 表长
}SqList;	// 顺序表


// 初始化顺序表
void InitList(SqList *L) {
    int i;
    for (i = 0; i < MaxSize; i ++) {
        strcpy(L->per[i].name, "佚名");		// 初始化姓名为佚名
        L->per[i].age = 0;					// 初始化年龄为 0
        strcpy(L->per[i].skill, "无");		// 初始化技能为无
    }
    L->length = 0;		// 初始化顺序表的长度
}


// 创建顺序表
void CreateList(SqList *L) {
    int i = 0;		// 表示当前输入第 i + 1 个人物信息
    int flag = 1;	// 1表示继续输入,0表示停止输入
    printf("---------------创建人物信息表--------------------\n");
    while(flag == 1) {
        // 人工输入人物信息
        printf("请输入第 %d 个人物的姓名:",  i + 1);
        scanf("%s", L->per[i].name);		    // 输入姓名
        printf("请输入第 %d 个人物的年龄:", i + 1);
        scanf("%d", &(L->per[i].age));		// 输入年龄
        printf("请输入第 %d 个人物的技能:", i + 1);
        scanf("%s", L->per[i].skill);		// 输入技能

        printf("请问是否还要继续输入? 1-是  0-否\t");
        scanf("%d", &flag);				// 输入判断
        i ++;
    }
    L->length = i;		// 修改表长
}


// 打印顺序表
void PrintList(SqList L) {
    printf("---------------打印人物信息----------------------\n");
    int i;
    for (i = 0; i < L.length; i ++) {
        printf("第 %d 个人的姓名为:%s\n", i + 1, L.per[i].name);
        printf("第 %d 个人的年龄为:%d\n", i + 1, L.per[i].age);
        printf("第 %d 个人的技能为:%s\n", i + 1, L.per[i].skill);
        printf("\n");
    }
}



// 查找顺序表
int SearchList(SqList L, char keyName[10]) {
    // 1、遍历顺序表,用keyName与各人物name进行比较
    int i = 0;
    for (i = 0;i<L.length;i++){
        if (!strcmp(L.per[i].name,keyName)){
            return i +1;  // 2、当找到 name == keyName 的人物时,返回此人物的位序
        }
    }
    return 0;
}

//打印单人的信息
void PrintListOne(SqList L,int num) {
    printf("---------------打印人物信息----------------------\n");
    printf("第 %d 个人的姓名为:%s\n", num, L.per[num-1].name);
    printf("第 %d 个人的年龄为:%d\n", num, L.per[num-1].age);
    printf("第 %d 个人的技能为:%s\n", num, L.per[num-1].skill);
}

// 删除顺序表中的元素
bool DeleteList(SqList *L, char keyName[10]) {
    // 0、如果为空表,则无法删除
    if (L->length == 0){
        return false;
    }
    // 1、先进行查找操作,找到 name == keyName 的人物(可调查找函数)
    int num = SearchList(*L,keyName);
    if (num == 0){
        return false;  // 2、如果没有找到此人物,则返回false,找到了则继续下一步
    } else{
        for (int i = num;i<L->length;i++){
            L->per[i-1] = L->per[i]; // 3、将排在被删除的人物后面的人物信息前移(循环)
        }
        L->length--;   // 4、修改表长,删除成功,返回true
        return true;
    }
}




// 在顺序表中插入数据元素
bool InsertList(SqList *L, Person newPer) {
    // 1、判断当前表长是否大于等于MaxSize,如果大于则返回false
    if (L->length >= MaxSize){
        return false;
    }
    // 2、在表尾插入新的人物信息
    printf("---------------插入人物信息----------------------\n");
    int num = L->length + 1;
    printf("请输入人物的姓名:");
    scanf("%s", newPer.name);		    // 输入姓名
    printf("请输入人物的年龄:");
    scanf("%d", &(newPer.age));		// 输入年龄
    printf("请输入人物的技能:");
    scanf("%s", newPer.skill);		// 输入技能
    strcpy(L->per[num - 1].name,newPer.name);
    L->per[num-1].age = newPer.age;
    strcpy(L->per[num-1].skill,newPer.skill);
    // 3、修改表长,插入成功,返回true
    L->length++;
    PrintList(*L);
    return true;

}


int main() {
    // 0、声明顺序表,并初始化顺序表
    SqList L;
    InitList(&L);


    // 1、创建顺序表(将输入的人物信息,录入到顺序表中)
    CreateList(&L);
    PrintList(L);


    // 2、根据姓名查找顺序表中的元素,并打印信息
    char name[10] ={0};
    printf("请输入你要查找人的姓名:");
    scanf("%s",name);
    int num = SearchList(L,name);
    if (num == 0){
        printf("未找到此人\n");
    } else{
        PrintListOne(L,num);
    }


    // 3、根据姓名删除某个元素的信息
    char name1[10] ={0};
    printf("请输入你要删除的人物姓名:");
    scanf("%s",name1);
    bool flag = DeleteList(&L,name1);
    if (flag == true){
        printf("%s的信息删除成功\n",name1);
        PrintList(L);
    } else{
        printf("未找到此人\n");
    }


    // 4、插入某个元素的信息(键盘输入元素,并插入顺序表中)
    Person newPer;
    InsertList(&L,newPer);


    return 0;
}

2、串的基本操作

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

#define MAX_LENGTH 50

// DString 结构定义
typedef struct {
    char *str;      // 指向串的起始地址
    int maxlength;  // 串的最大容量
    int length;     // 当前串长
} DString;

// 初始化动态顺序串
void StrInit(DString *s) {
    s->str = (char *)malloc(MAX_LENGTH);
    s->maxlength = MAX_LENGTH;
    s->length = 0;
}
// 求串的实际长度
int StrLength(DString s) {
	return s.length;
}

// 求串的最大长度
int StrMaxLength(DString s) {
	return s.maxlength;
}

// 判定串是否为空
bool StrEmpty(DString s){
    if (s.length == 0){
 		return true;
    } else {
    	return false;
	}
}


// 赋值动态顺序串
void StrAssign(DString *s, char *chars) {
	int maxLength = s->maxlength;
	int charsLength = strlen(chars);
	if (charsLength > maxLength){
		maxLength = charsLength;
	}
	s->str = (char *) malloc(sizeof(char) * maxLength);  // 申请空间
	s->length = strlen(chars);		// 求串长(C语言自带函数)
    s->maxlength = maxLength;		// 最大容量为当前申请的大小
    for (int i = 0; i < s->length; i ++) {
    	s->str[i] = chars[i];		// 将chars的元素赋值给串
	}
//	printf(" 赋值length : %d \n", s->length);
}



// 释放动态顺序串内存
void StrDestory(DString *s) {
    free(s->str);
    s->str = NULL;
    s->maxlength = 0;
    s->length = 0;
}

// 打印串的内容
void StrPrint(DString s) {
    if (s.length == 0){
    	printf("串为空\n");
    	return;
	}
	for (int i=0; i < s.length; i++){
		printf("%c",s.str[i]);
	}
	printf("\n");
}

// 串的比较
int StrCompare(DString s, DString t)
{
	for (int i = 0; i < s.length && i < t.length; i ++){
		if (s.str[i] != t.str[i]) {
			return s.str[i] - t.str[i];
		}
	}
	return s.length - t.length;
}

// 插入子串(s为主串, t为需插入的子串,p插入的位置,p从0开始编号)
bool StrInsert(DString *s, DString t, int p) {
    /* 函数参数、返回值不能修改!!!! */
    if (p <= 0 || p >s->length){
        return false;      //插入位置不合法
    }
    int num = 0;
    int tLength = t.length;
    //插入串 < max - p
    if (tLength < s->maxlength - p+1){   //比如最大为6,你要插2号位,则最多会有1,2,3,4,5--5个位置可以插入
        //先腾出位置为插入串
        for (int i = s->length+tLength-1;i>=p+tLength-1;i--){
            s->str[i] = s->str[i-tLength];
        }
        s->length +=tLength;
        //插入
        for (int i = p-1;i<p + tLength-1;i++){
            s->str[i] = t.str[num];
            num++;
        }

        return true;
    }
    //插入串 >= max - p
    if (tLength >= s->maxlength - p+1){
        for (int i = p-1;i<s->maxlength;i++){
            s->str[i] = t.str[num];
            num++;
        }
        s->length = s->maxlength;
        return true;
    }

}

// 删除子串 (s为主串, 从第p个位置起删除长度为len的子串,p从0开始编号)
bool StrDelete(DString *s, int p, int len) {
    /* 函数参数、返回值不能修改!!!! */
    if (p <= 0 || p >s->length){
        return false;      //删除的位置不合法
    }
    if (p + len >= s->maxlength){   //此时p位置后的全删除
        s->length = p-1;
        return true;
    }
    int num = p + len -1;   //定位要从哪个位置开始替换
    for (int i = num;i<s->length;i++){
        s->str[i-len] = s->str[i]  ;
    }
    s->length -=len;
    return true;
}

// 朴素模式匹配算法
int BFIndex (DString *s, DString t, int p)	 {
	int i = p, j = 0;
	while ((i < s->length && j< t.length)) {
	    if (s->str[i] == t.str[j]){     // 如果相等,继续往下比较
	          i++, j++;
	    }else{
	          i = i - j +1, j = 0;  // 如果不相等,S的下一个字符和T的第一个字符比较
	    }
	}

	if (j >= t.length) {
		return i - t.length;
	}else{
	    return -1;
	}
}
// 替换子串
bool StrReplace(DString *s , int p, DString t, DString v) {
	int i, j, k;
	k = 0;
	for (i=p; i <= s->length - t.length; i++) {
		j = BFIndex(s, t, i);
		if (j == -1){
			if (k==0) {
				printf("没有找到要找的字符串! \n");
				return false;
			}else{
				printf("完成了%d次替换! \n", k);
				return true;
			}

		} else{
			if (StrDelete(s, j, t.length)){
				if (StrInsert(s,v,j)){
					k+=1;
				}
			}
		}
	}
}

void main(){
	DString s, t, v; // 定义主串为s, 被替换的串为t,替换后的串为v
	int start=0;
	// 初始化串
	StrInit(&s);
	StrInit(&t);
	StrInit(&v);
	// 定义接收各串的字符数组
	char schar[10000];
	char tchar[100];
    int num = 0;
    int strNum = 0;
	printf("请输入主串: \n");
	scanf("%s", schar);
	StrAssign(&s,schar);
	printf("请输入要插入的子串: \n");
	scanf("%s", tchar);
	StrAssign(&t,tchar);
    printf("请输入要插入的位置: \n");
    scanf("%d", &num);
    bool flag = StrInsert(&s,t,num);
    if (flag == true){
        printf("插入成功此时主串为:");
        StrPrint(s);
    } else{
        printf("插入失败");
    }
    printf("请输入要删除的起始的位置: \n");
    scanf("%d", &num);
    printf("请输入要删除的字符个数: \n");
    scanf("%d", &strNum);
    StrDelete(&s,num,strNum);
    StrPrint(s);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值