链表的分解

来源:互联网 发布:人工智能客服开源系统 编辑:程序博客网 时间:2024/05/16 10:54

       已知L为无头结点单链表中第一个结点的指针,每个结点数据域存放一个字符,该字符可能是英文字母字符或数字字符或其它字符,编写算法构造三个以带头结点的单循环链表表示的线性表,使每个表中只含同一类字符。(要求用最少的时间和最少的空间)

#include<stdio.h>#include<stdlib.h>#include<time.h>typedef struct Node{    char data;    struct Node *next;}linklist;/*功能:随机生成一个长度为  n  无头节点的链表  输入:链表的长度  返回:链表的第一个创立节点的地址*/linklist *autoCreate(int n){    linklist *first=NULL,*cur,*p;    int i;    char ch;    srand(time(NULL));   //设置时间种子    for(i=0;i<n;i++)    {        p=(linklist*)malloc(sizeof(linklist));        p->next=NULL;        ch=rand()%128;        p->data=ch;        if(first==NULL)        {            first=p;            cur=first;        }        else        {            cur->next=p;            cur=p;        }    }    return first;}/*功能:输出链表字符  输入:链表的头指针  输出:链表数据域的字符*/void disp(linklist *head){    linklist *p=head->next;    while(p!=head)    {        printf("%c",p->data);        p=p->next;    }    printf("\n");}/*释放循环链表的申请空间*/void _clear(linklist *head){    linklist *p=head->next;    while(p!=head)    {        head->next=p->next;        free(p);        p=head->next;    }    free(head);}/*功能:判断一个字符是 英文字母 、数字、还是其余字符  分别返回 1   2    3*/int get_attribute(char ch){    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))    {        return 1;    }    else if(ch>='0'&&ch<='9')    {        return 2;    }    else    {        return 3;    }}/*功能:将一个无头节点,数据域为 char 的循环链表分解为 字母、数字、其余三个有头节点链表、并printf  输入:无需输入,字符有电脑随机生成  输出:电脑随机生成的字符、三个子链表的字符*/  void partition_linklist()  {      int n,i;      linklist *first,*pnumber,*pletter,*pdefault,*p,*p1,*p2,*p3;      printf("请输入字符的个数:");      scanf("%d",&n);      first=autoCreate(n);      p1=pletter=(linklist*)malloc(sizeof(linklist));      p2=pnumber=(linklist*)malloc(sizeof(linklist));      p3=pdefault=(linklist*)malloc(sizeof(linklist));      p1->next=p1;      p2->next=p2;      p3->next=p3;      printf("未分拆时字符:");      p=first;      while(p)      {          printf("%c",p->data);          p=p->next;      }      printf("\n");      p=first;      while(p)          //分拆链表,建立三个循环链表      {          i=get_attribute(p->data);          switch(i)          {          case 1:            {                p1->next=p;                p=p->next;                p1=p1->next;                p1->next=pletter;                break;            }            case 2:            {                p2->next=p;                p=p->next;                p2=p2->next;                p2->next=pnumber;                break;            }          case 3:            {                p3->next=p;                p=p->next;                p3=p3->next;                p3->next=pdefault;                break;            }          }      }      printf("英语字母:");  //输出三个链表的数据域      disp(pletter);      printf("数字:");      disp(pnumber);      printf("其余字符:");      disp(pdefault);      _clear(pletter);        //释放空间      _clear(pnumber);      _clear(pdefault);  }  int main()  {      partition_linklist();      return 0;  }


0 0
原创粉丝点击