链表信息分类问题
- 主要是把原链表中的元素依次检测并分类插入到新建链表中实现分类,将原链表中的元素取出插入到其他链表的同时删除元素,这样剩下的就是另一类元素了,这样做的空间复杂度不敢说是最低的,但从分类并储存这点来说,空间复杂度应该算是较低的,当然这样做是牺牲了时间复杂度的前提下;(果然还是细节重要啊,一个j++忘记写导致我一段时间怀疑链表删除函数是不是学错了,当然还有一个重点也是容易忽略的:每删除一个节点后应使该节点重新指向原位置,这里我使用了一个前驱节点来实现这个问题)
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
using namespace std;
typedef struct Node
{
char data;
Node *next;
}Linklist;
int Check(char e)
{
if (e >= 'a' && e <= 'z' || e > 'A' && e <= 'Z')
return 1;
else if (e >= '0' && e <= '9')
return 0;
else
return -1;
}
void Deleted(Linklist *&A, int i)
{
Linklist *p = A, *q;
int j = 0;
while (j != i)
{
p = p->next;
j++;
}
q = p->next;
p->next = q->next;
free(q);
}
void Insert(Linklist *&L, char e)
{
Linklist *t, *p = L;
t = (Linklist *)malloc(sizeof(Linklist));
t->data = e;
while (p->next != NULL)
p = p->next;
p->next = t;
t->next = NULL;
}
void Displist(Linklist *L)
{
Linklist *p = L->next;
while (p != NULL)
{
cout << p->data;
p = p->next;
}
}
int main()
{
char w[100];
int i;
Linklist *A, *B, *C, *p, *q, *t;
cin >> w;
A = (Linklist *)malloc(sizeof(Linklist));
A->next = NULL;
p = A;
for (i = 0;i < strlen(w);i++)
{
t = (Linklist *)malloc(sizeof(Linklist));
t->data = w[i];
p->next = t;
p = t;
}
p->next = NULL;
B = (Linklist *)malloc(sizeof(Linklist));
B->next = NULL;
C = (Linklist *)malloc(sizeof(Linklist));
C->next = NULL;
i = 0;
p = A;
q = p->next;
while (q != NULL)
{
if (Check(q->data) == 0)
{
Insert(B, q->data);
Deleted(A, i);
q = p->next;
}
else if (Check(q->data) == 1)
{
Insert(C, q->data);
Deleted(A, i);
q = p->next;
}
else
{
p = p->next;
q = q->next;
i++;
}
}
Displist(B);
cout << endl;
Displist(C);
cout << endl;
Displist(A);
cout << endl;
return 0;
}