代码如下:
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct node{
char val;
int loc[101];
int len;
struct node *next;
}LinkList;
void addTo(LinkList *&head, LinkList *&rear, char ch, int index) //&很关键
{
LinkList *p = head->next;
while(p != NULL)
{
if(p->val == ch)
{
p->loc[p->len] = index;
p->len++;
return;
}
p = p->next;
}
//未找到
p = (LinkList *)malloc(sizeof(LinkList));
p->val = ch;
p->len = 0;
p->loc[p->len++] = index;
p->next = NULL;
p->next = rear->next;
rear->next = p;
rear = p;
}
int main()
{
char str[101];
cin>>str;
if(str == NULL || str[0] == '\0')
return 0;
LinkList *head = (LinkList *)malloc(sizeof(LinkList));
head->next = NULL;
LinkList *rear = head;
for(int i = 0; str[i] != '\0'; i++)
{
addTo(head, rear, str[i], i);
}
LinkList *p = head->next;
while(p != NULL)
{
if(p->len > 1)
{
cout<<p->val<<':'<<p->loc[0];
for(int i = 1; i < p->len; i++)
{
cout<<','<<p->val<<':'<<p->loc[i];
}
cout<<endl;
}
p = p->next;
}
}
总结:
void addTo(LinkList *&head, LinkList *&rear, char ch, int index)
里面的&很关键,是对传入参数head和rear的引用。如果不加这两个&,会变成“头插法”,顺序正好相反,因为此时main()函数中的rear相当于没有改变。