新手,帮忙看一下,单链表问题!
要求:将t在s中所有出现的的位置储存在带头结点的单链表中 #include "stdio.h"
#include "string.h"
#include "stdlib.h"
typedef struct node{
int data;
struct node *next;
}linknode,*linklist;
int index(char *S,char *t){
int i=0,j;
while(S[i]){ //判断主串是否为空
j=0; //每次进行匹配是将j置为零,以便于每一次比较都从子串的第一个结点的位置开始
while(t[j]&&S[i+j]){
if(S[i+j]==t[j]){ // 判断主串与子串是否相等
j++;
if(!t[j]){ //当匹配到子串的下一个结点为空时,则说明匹配成功,然后返回i的值
return i;
}
}
else break; //若匹配不成功,主串移向下一个位置然后再与子串开始匹配
}
i++;
}
return (-1);
}
linklist indexall(char *S,char *t){
linklist head,p,q;
int j,count;
head=(linklist )malloc(sizeof(linknode));//创建一个带头结点的链表
head->next=NULL;
q=head;
j=index(S,t); //把匹配成功后的第一个匹配的结点的下标地址给j
for(count=0;count<strlen(t);count++){
p=(linklist )malloc(sizeof(linknode)); //给p分配内存
p->data=j+count; //把t在s中出现的位置储存在带头结点的链表中
p->next=q->next; //链表的插入操作
q->next=p;
q=q->next;
}
return q;
}
void print(linklist head){
linklist p;
p=head->next;
while(p){
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
int main(){
char S[80],t[80];
linklist head;
printf("请输入主串:");
gets(S);
printf("请输入子串:");
gets(t);
int k=index(S,t);
printf("k=%d\n",k);
head=indexall(S,t);
printf("\n[%s]在[%s]中的位置有:\n",t,S);
print(head);
}