数据结构实训作业

博主在调试程序时遇到bug,经debug发现给subStr中的data数组第一个元素是回车符,推测是输入时回车符被subStr接收。于是在给subStr赋值前加getchar()接收回车符,问题得以解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1 #include <stdio.h>
  2 #define DataMax 100
  3 typedef struct {
  4     char data[DataMax];
  5     int length;
  6 }string;
  7 //初始化字符串
  8 void initString(string *s)
  9 {
 10     s->length = 0;
 11 }
 12 //输入字符串
 13 void inputString(string *s)
 14 {
 15     char c;
 16     int i = 0;
 17     printf("请输入字符串,以#为结束标志:");
 18     while((c = getchar()) != '#')
 19     {
 20         s->data[i++] = c;
 21     }
 22     s->data[i] = '\0';
 23     s->length = i;
 24 }
 25 //得到字符串的长度
 26 int getLength(string *s)
 27 {
 28     return s->length;
 29 }
 30 //将s2的内容复制到s1
 31 void copyString(string *s1, string *s2)
 32 {
 33     int i;
 34     for(i =0; i<s2->length; i++)
 35     {
 36         s1->data[i] = s2->data[i];
 37     }
 38     s1->length = s2->length;
 39     s1->data[i] = '\0';
 40 }
 41 //判断字符串是否相等
 42 int equalString(string *s1, string *s2)
 43 {
 44     int i;
 45     //如果两个字符串长度不一样的话那两个字符串一定不相等
 46     if(s1->length != s2->length)
 47     {
 48         return 1;
 49     }
 50     for(i = 0; s1->data[i] == s2->data[i] && s1->data[i] != '\0' && s2->data[i] != '\0'; i++);
 51     if(s1->data[i] == s2->data[i])
 52     {
 53         return 0;
 54     }
 55 }
 56 //连接两个字符串
 57 string concatString(string *s1, string *s2)
 58 {
 59     string s3;
 60     int i,j;
 61     for(i =0; i<s1->length; i++)
 62     {
 63         s3.data[i] = s1->data[i];
 64     }
 65     for(i =s1->length,j =0; j<s2->length; i++,j++)
 66     {
 67         s3.data[i] = s2->data[j];
 68     }
 69     s3.data[i] = '\0';
 70     s3.length = s1->length + s2->length;
 71     return s3;
 72 }
 73 //求子串返回串s的第i个位置开始的j个字符组成的串
 74 string subString(string *s, int i, int j)
 75 {
 76     string s1;
 77     if(i<1 ||i>s->length ||j<0||i+j>s->length)
 78     {
 79         printf("输入的数字有错误");
 80     }
 81     for(int k = 0; k<j; k++)
 82     {
 83         s1.data[k] = s->data[i-1+k];
 84     }
 85     s1.length = j;
 86     return s1;
 87 }
 88 //返回子串s2在主串s1中的位置
 89 int Index(string *s1, string *s2)
 90 {
 91     int i;
 92     int j;
 93     for(i =0; i<s1->length; i++)
 94     {
 95         j =0;
 96         while(s1->data[i] == s2->data[j])
 97         {
 98             i++;
 99             j++;
100         }
101         i = i-j;
102         if(j >= s2->length)
103         {
104             return i+1;
105         }
106     }
107 }
108 //输出字符串
109 void dispStr(string *s)
110 {
111     for(int i = 0; i<s->length; i++)
112     {
113         printf("%c",s->data[i]);
114     }
115     printf("\n");
116 }
117 int main() {
118     string s1;
119     string s2;
120     string s3;
121     string s4;
122     string subStr;
123     int position = -1;
124     int i,j;
125     initString(&s1);
126     inputString(&s1);
127     copyString(&s2, &s1);
128     printf("字符串s1:");
129     dispStr(&s1);
130     printf("字符串s2:");
131     dispStr(&s2);
132     printf("字符串s1的长度为:%d\n",s1.length);
133     printf("字符串s2的长度为:%d\n",s2.length);
134     if(!equalString(&s1, &s2))
135     {
136         printf("字符串s1与字符串s2相等\n");
137     }
138     else
139     {
140         printf("字符串s1与字符串s2不相等\n");
141     }
142     s3 = concatString(&s1, &s2);
143     printf("字符串s1与字符串s2连接之后的字符串s3:");
144     dispStr(&s3);
145     printf("请输入您需要查找的子串从第几个位置开始,长度为多少:");
146     scanf("%d%d",&i,&j);
147     s4 = subString(&s1, i, j);
148     printf("从第%d个位置开始,长度为%d的字符串s4:",i,j);
149     dispStr(&s4);
150     printf("请输入您需要查找位置的子串:");
151     getchar();
152     inputString(&subStr);
153     position = Index(&s1, &subStr);
154     if(position == -1)
155     {
156         printf("您输入的字符串不是s1的子串");
157     }
158     else
159     {
160         printf("您输入的子串在主串s1中的%d个位置",position);
161     }
162 }

在此151 行那个getchar();是必要的,本来有一个bug看了好久看不出来有什么问题,后来进行debug调试,然后发现在给subStr中的data数组里面第一个元素竟然是一个回车符,所以我猜想应该是我输入的时候有回车符被subStr给接收到了,所以我在给subStr赋值前加了一个getchar();去接收那个回车符,然后程序就没有问题了。解决问题之后感觉又舒服了。

转载于:https://www.cnblogs.com/sucker/p/10891470.html

1. 顺序存储结构中数据中数据元素之间逻辑关系是由( )表示的,链接存储结构中的数据元素之间的逻辑关系是由( )表示的。 A.线性结构 B.非线性结构 C.存储位置 D.指针 2. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不能为空 C. 一个无限序列,可以为空 D. 一个无限序列,不能为空 3. 已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。 A. 108 B. 180 C. 176 D. 112 4. 在单链表中删除指针p所指结点的后继结点,则执行( )。 A. p->next= p->next->next B. p->next= p->next C. p= p->next->next D. p= p->next; p->next= p->next->next 5. 若某链表最常用的操作是在最后一个结点之后插入一个结点删除最后一个结点,则采用( )存储方式最节省时间。 A. 单链表 B. 双链表 C. 带头结点的双循环链表 D. 单循环链表 6.二维数组A[7][8]以列序为主序的存储, 计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A. 38 B. 43 C. 26 D. 29 二、完成下列填空题(每空3分,共9分)。 1.在顺序表L中第i个位置上插入一个新的元素e: Status ListInsert_Sq(SqList &L , int i , ET e){ if ( iL.length+1) return ERROR; if(L.length >= L.listsize){ p=(ET*)realloc(L.elem,(L.listsize+10)*sizeof(ET)); if (p==NULL) exit(OVERFLOW); L.elem=p; } for( j=L.length ; j>=i ; --j ) L.elem[j]=L.elem[j-1] ; L.elem[j]=e ; ++L.length ; return OK; } 2. 删除双向链表中p所指向的节点算法: status delete(DuLinkList L, DuLinkList p) { if (p= =L) return ERROR; else { p->prior->next=p->next; p->next->prior=p->prior ; } free(p); return OK; } 三、编程题(共27分)。 1. (共12分)用顺序表表示集合,设计算法实现集合的求差集运算,要求不另外开辟空间。 顺序表的存储结构定义如下: #define Maxsize 100 typedef struct { ElemType data[MaxSize]; // ElemType表示不确定的数据类型 int length; // length表示线性表的长度 }SqList; 将如下函数,伪码补充完整(8分),代码前先用文字描述自己的算法思想(4分)。 文字描述算法:略(4分) void Difference(SqList A, SqList B) {//参考代码如下如下(8分) for (i=0;i<A.length;i++) for(j=0;j<B.length;j++) if(A.data[i]==B.data[j]) { A.data[i]=’#’; break; } for (k=0,i=0;inext == L) return; p = L; while (p->next != L)   { if (p->next->data != e) P = p->next; else { q = p->next;p->next = q->next; free(q);} } } 时间复杂度分析:(2分) 时间复杂度为O(n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值