user-0 提问: 数据结构求解

回复:
user: user-0
content: 引用 1 楼 不闻窗外事的回复:int sstrcmp(seqstring *s1, seqstring *s2)//字符串的比较 { 	int i = 0, flag = 1, m = 0, n1, n2; 	n1 = sstrlen(s1); 	n2 = sstrlen(s2); 	while ((flag == 1) && (i <= n1) && (i <= n2)) 	{ 		i++; 		if (s1->data[i] != s2->data[i]) flag = 0; 	} 	if ((flag == 1) && (i>n1) && (i>n2))  m = 0; 	else 		m = s1->data[i] - s2->data[i];  	return(m); }  你这个比较函数就没比较第一个字节啊，应该把i++放到if语句后面 可是字符串不是从data[1]开始的吗，i++后就是从1开始的啊

user: user-1
content: int sstrcmp(seqstring *s1, seqstring *s2)//字符串的比较 { 	int i = 0, flag = 1, m = 0, n1, n2; 	n1 = sstrlen(s1); 	n2 = sstrlen(s2); 	while ((flag == 1) && (i <= n1) && (i <= n2)) 	{ 		i++; 		if (s1->data[i] != s2->data[i]) flag = 0; 	} 	if ((flag == 1) && (i>n1) && (i>n2))  m = 0; 	else 		m = s1->data[i] - s2->data[i];  	return(m); }  你这个比较函数就没比较第一个字节啊，应该把i++放到if语句后面

user: user-1
content: 引用 9 楼 qq_45822778 的回复:[quote=引用 8 楼 qq_45822778的回复:][quote=引用 7 楼 不闻窗外事的回复:]对啊，你在第一个输入里的换行会放到第二个输入里，过滤掉就好了 嗯，谢谢！不让只发三个字[/quote] 你汇编语言会的话可以帮我看下我的汇编问题[/quote] 哈哈，不怎么会的，汇编现在很少有机会能用到

user: user-0
content: 引用 8 楼 qq_45822778的回复:[quote=引用 7 楼 不闻窗外事的回复:]对啊，你在第一个输入里的换行会放到第二个输入里，过滤掉就好了 嗯，谢谢！不让只发三个字[/quote] 你汇编语言会的话可以帮我看下我的汇编问题

user: user-0
content: 引用 7 楼 不闻窗外事的回复:对啊，你在第一个输入里的换行会放到第二个输入里，过滤掉就好了 嗯，谢谢！不让只发三个字

user: user-1
content: 对啊，你在第一个输入里的换行会放到第二个输入里，过滤掉就好了

user: user-0
content: 引用 5 楼 不闻窗外事的回复:#include <stdio.h>  #define maxsize 688  typedef struct node { 	char data[maxsize]; 	int slen; }seqstring;  seqstring a, b, c;  void set(seqstring *s)//顺序串赋值 { 	char c; 	int j = 1; 	printf("\n\n\t\t请输入一个字符串，以#作为结束符："); 	scanf("%c", &c); 	while (c != '#'&&j<maxsize) 	{ 		if (c != '\n') 		{ 			s->data[j] = c; 			j++; 		} 		scanf("%c", &c); 	} 	s->data[j] = '\0'; 	s->slen = j - 1; 	printf("[%s]\n", &(s->data[1])); }  int sstrlen(seqstring *s)//返回顺序串长度 { 	return (s->slen); }  void print(seqstring *s)//输出字符串 { 	int i; 	for (i = 1; i <= s->slen; i++) 		printf("%c", s->data[i]); 	printf("\n"); }  int sstract(seqstring *s1, seqstring *s2, seqstring *s3)//顺序串连接 { 	int i, j, k; 	i = sstrlen(s1); 	j = sstrlen(s2); 	if ((i + j)>maxsize)  return 1; 	for (k = 1; k <= i; k++) 		s3->data[k] = s1->data[k]; 	for (k = 1; k <= j; k++) 		s3->data[i + k] = s2->data[k]; 	s3->data[i + j + 1] = '\0'; 	s3->slen = i + j; 	printf("[%s]\n", &(s3->data[1])); 	return 0; }  int sstrcmp(seqstring *s1, seqstring *s2)//字符串的比较 { 	int i = 0, flag = 1, m = 0, n1, n2; 	n1 = sstrlen(s1); 	n2 = sstrlen(s2); 	while ((flag == 1) && (i <= n1) && (i <= n2)) 	{ 		i++; 		if (s1->data[i] != s2->data[i]) flag = 0; 	} 	if ((flag == 1) && (i>n1) && (i>n2))  m = 0; 	else 		m = s1->data[i] - s2->data[i];  	return(m); }  int substr(seqstring *s, int i, int k, seqstring *t)//求子串 { 	int m = s->slen; 	if (i<1 || i>m) 		return 1; 	if (k <= 0 || (i + k - 1) >= m) 		return 1; 	for (m = 1; m <= k; m++) 		t->data[m] = s->data[i + m - 1]; 	t->data[m] = '\0'; 	t->slen = k; 	return 0; }  void menu()//菜单函数  {  	printf("\t\t*************************\n");  	printf("\t\t         串的应用        \n");  	printf("\t\t*************************\n");  	printf("\t\t    1. 字符串的连接\n");  	printf("\t\t    2. 字符串的比较\n");  	printf("\t\t    3. 求串的长度\n");  	printf("\t\t    4. 求串的子串\n");  	printf("\t\t    5. 串的匹配\n");  	printf("\t\t    0. 退 出\n");  	printf("\t\t*************************\n");  }  int  main() { 	int n, i, d, f; 	int ch; 	set(&a);//建立字符串a 	set(&b);//建立字符串b 	menu();//菜单 	while (1) 	{ 		printf("\n\t\t请选择菜单功能: "); 		scanf("%d", &ch); 		printf("\n"); 		switch (ch) 		{ 		case 1: //连接字符串 			seqstring t; 			i = sstract(&a, &b, &t); 			printf("\t\t连接的字符串为："); 			print(&t); 			break; 		case 2://比较字符串大小 			n = sstrcmp(&a, &b); 			if (n == 0) 				printf("\t\ta,b两串相等\n"); 			else 				if (n > 0) 					printf("\t\ta串大于b串\n"); 				else 					printf("\t\ta串小于b串\n"); 			break; 		case 3://求字符串长度 			n = sstrlen(&a); 			printf("\t\ta的长度为：%d, ", n); 			n = sstrlen(&b); 			printf("\t\tb的长度为：%d。", n); 			break; 		case 4://求字符串子串 			printf("\t\t请选择取a和b的子串，1是a，2是b："); 			scanf("%d", &i); 			printf("\n"); 			if (i == 1)//a的子串 			{ 				printf("\t\t请选择子串开始的i值与子串的长度k的值："); 				scanf("%d%d", &d, &f); 				printf("\n"); 				substr(&a, d, f, &c); 				printf("\t\t子串是："); 				print(&c); 			} 			if (i == 2)//b的子串 			{ 				printf("\t\t请选择子串开始的i值与子串的长度k的值："); 				scanf("%d%d", &d, &f); 				printf("\n"); 				substr(&b, d, f, &c); 				printf("\t\t子串是："); 				print(&c); 			}  			break; 		case 0://退出 			return 0; 		} 	} }   改了你的创建接口，比较接口我看还OK啊，你先试试吧 改了创建接口就全对了，谢谢大佬！我之前没设if，是不是被换行搞的

user: user-1
content: #include <stdio.h>  #define maxsize 688  typedef struct node { 	char data[maxsize]; 	int slen; }seqstring;  seqstring a, b, c;  void set(seqstring *s)//顺序串赋值 { 	char c; 	int j = 1; 	printf("\n\n\t\t请输入一个字符串，以#作为结束符："); 	scanf("%c", &c); 	while (c != '#'&&j<maxsize) 	{ 		if (c != '\n') 		{ 			s->data[j] = c; 			j++; 		} 		scanf("%c", &c); 	} 	s->data[j] = '\0'; 	s->slen = j - 1; 	printf("[%s]\n", &(s->data[1])); }  int sstrlen(seqstring *s)//返回顺序串长度 { 	return (s->slen); }  void print(seqstring *s)//输出字符串 { 	int i; 	for (i = 1; i <= s->slen; i++) 		printf("%c", s->data[i]); 	printf("\n"); }  int sstract(seqstring *s1, seqstring *s2, seqstring *s3)//顺序串连接 { 	int i, j, k; 	i = sstrlen(s1); 	j = sstrlen(s2); 	if ((i + j)>maxsize)  return 1; 	for (k = 1; k <= i; k++) 		s3->data[k] = s1->data[k]; 	for (k = 1; k <= j; k++) 		s3->data[i + k] = s2->data[k]; 	s3->data[i + j + 1] = '\0'; 	s3->slen = i + j; 	printf("[%s]\n", &(s3->data[1])); 	return 0; }  int sstrcmp(seqstring *s1, seqstring *s2)//字符串的比较 { 	int i = 0, flag = 1, m = 0, n1, n2; 	n1 = sstrlen(s1); 	n2 = sstrlen(s2); 	while ((flag == 1) && (i <= n1) && (i <= n2)) 	{ 		i++; 		if (s1->data[i] != s2->data[i]) flag = 0; 	} 	if ((flag == 1) && (i>n1) && (i>n2))  m = 0; 	else 		m = s1->data[i] - s2->data[i];  	return(m); }  int substr(seqstring *s, int i, int k, seqstring *t)//求子串 { 	int m = s->slen; 	if (i<1 || i>m) 		return 1; 	if (k <= 0 || (i + k - 1) >= m) 		return 1; 	for (m = 1; m <= k; m++) 		t->data[m] = s->data[i + m - 1]; 	t->data[m] = '\0'; 	t->slen = k; 	return 0; }  void menu()//菜单函数  {  	printf("\t\t*************************\n");  	printf("\t\t         串的应用        \n");  	printf("\t\t*************************\n");  	printf("\t\t    1. 字符串的连接\n");  	printf("\t\t    2. 字符串的比较\n");  	printf("\t\t    3. 求串的长度\n");  	printf("\t\t    4. 求串的子串\n");  	printf("\t\t    5. 串的匹配\n");  	printf("\t\t    0. 退 出\n");  	printf("\t\t*************************\n");  }  int  main() { 	int n, i, d, f; 	int ch; 	set(&a);//建立字符串a 	set(&b);//建立字符串b 	menu();//菜单 	while (1) 	{ 		printf("\n\t\t请选择菜单功能: "); 		scanf("%d", &ch); 		printf("\n"); 		switch (ch) 		{ 		case 1: //连接字符串 			seqstring t; 			i = sstract(&a, &b, &t); 			printf("\t\t连接的字符串为："); 			print(&t); 			break; 		case 2://比较字符串大小 			n = sstrcmp(&a, &b); 			if (n == 0) 				printf("\t\ta,b两串相等\n"); 			else 				if (n > 0) 					printf("\t\ta串大于b串\n"); 				else 					printf("\t\ta串小于b串\n"); 			break; 		case 3://求字符串长度 			n = sstrlen(&a); 			printf("\t\ta的长度为：%d, ", n); 			n = sstrlen(&b); 			printf("\t\tb的长度为：%d。", n); 			break; 		case 4://求字符串子串 			printf("\t\t请选择取a和b的子串，1是a，2是b："); 			scanf("%d", &i); 			printf("\n"); 			if (i == 1)//a的子串 			{ 				printf("\t\t请选择子串开始的i值与子串的长度k的值："); 				scanf("%d%d", &d, &f); 				printf("\n"); 				substr(&a, d, f, &c); 				printf("\t\t子串是："); 				print(&c); 			} 			if (i == 2)//b的子串 			{ 				printf("\t\t请选择子串开始的i值与子串的长度k的值："); 				scanf("%d%d", &d, &f); 				printf("\n"); 				substr(&b, d, f, &c); 				printf("\t\t子串是："); 				print(&c); 			}  			break; 		case 0://退出 			return 0; 		} 	} }   改了你的创建接口，比较接口我看还OK啊，你先试试吧

user: user-0
content: 引用 3 楼 不闻窗外事的回复:[quote=引用 2 楼 qq_45822778 的回复:] [quote=引用 1 楼 不闻窗外事的回复:]int sstrcmp(seqstring *s1, seqstring *s2)//字符串的比较 { 	int i = 0, flag = 1, m = 0, n1, n2; 	n1 = sstrlen(s1); 	n2 = sstrlen(s2); 	while ((flag == 1) && (i <= n1) && (i <= n2)) 	{ 		i++; 		if (s1->data[i] != s2->data[i]) flag = 0; 	} 	if ((flag == 1) && (i>n1) && (i>n2))  m = 0; 	else 		m = s1->data[i] - s2->data[i];  	return(m); }  你这个比较函数就没比较第一个字节啊，应该把i++放到if语句后面 可是字符串不是从data[1]开始的吗，i++后就是从1开始的啊[/quote] 字符串一般都是从0开始啊，我没注意你怎么实现的，正常是从0[/quote] 可以帮我看下不，仔细看看

user: user-1
content: 引用 2 楼 qq_45822778 的回复:[quote=引用 1 楼 不闻窗外事的回复:]int sstrcmp(seqstring *s1, seqstring *s2)//字符串的比较 { 	int i = 0, flag = 1, m = 0, n1, n2; 	n1 = sstrlen(s1); 	n2 = sstrlen(s2); 	while ((flag == 1) && (i <= n1) && (i <= n2)) 	{ 		i++; 		if (s1->data[i] != s2->data[i]) flag = 0; 	} 	if ((flag == 1) && (i>n1) && (i>n2))  m = 0; 	else 		m = s1->data[i] - s2->data[i];  	return(m); }  你这个比较函数就没比较第一个字节啊，应该把i++放到if语句后面 可是字符串不是从data[1]开始的吗，i++后就是从1开始的啊[/quote] 字符串一般都是从0开始啊，我没注意你怎么实现的，正常是从0