字符串的应用

来源:互联网 发布:幸运星 山本宽 知乎 编辑:程序博客网 时间:2024/06/15 20:36

        对解决非数值的问题,主要设计到的操作对象是字符串,简称串。

        对串的存储可以又两种处理方式:一种是将串定义成字符型数组,串的存储空间分配在编译是完成,不能更改,这种方式称为串的静态存储结构; 另外一种是串的存储空间在程序运行时动态分配,这种方式称为串的动态存储结构。

        串的链式存储结构是包含数据域和指针域的节点结构。其中数据域用来存储字符,指针域存储指向下一个节点的指针,这样的一个串可以用一个单链表来表示。
        用单链表存放字符串,若每个节点仅放一个字符,则每个节点的指针域所栈存储空间比数据域所占存储空间要大的多。为了节省空间,可使每个节点存放若干个字符,这称职位块链结构。显然块链结构的存储密度高于一个节点存储一个字符的链表结构。通常,串的链式存储结构多采用块链结构。具体例子如下(对每行数据进行操作):

 

#include <stdio.h>
#include <stdlib.h>

#define MAX 100
#define DATA_MAX 80

typedef struct node
{
 char Data[DATA_MAX];

 struct node *next;
}nodetype;

typedef struct head
{
 int num;
 int len;
 
 nodetype *next;
}headtype;

headtype Head[MAX];

void Initial();
int MenuSelect();
void EnterData();
void DeleteLine();
void List();
void ClearBuffer();

int main()
{
 char choice;
 Initial();
 while(1)
 {
  choice = MenuSelect();
  switch(choice)
  {
   case 1:
    EnterData();
    break;
   case 2:
    DeleteLine();
    break;
   case 3:
    List();
    break;
   case 4:
    exit(0);
   default:
    exit(1);
  }  
 }
}

void ClearBuffer()
{
 while(getchar()!= '/n');
}

void Initial()
{
 int i;
 for(i = 0; i<MAX; i++)
 {
  Head[i].len = 0;
 }
}

int MenuSelect()
{
 int i = 0;
 
 printf("  1: Enter/n");
 printf("  2: Delete/n");
 printf("  3: List/n");
 printf("  4: Exit/n");

 while(i<= 0 || i> 4)
 {
  printf(" 请输入菜单选择号...../n ");
  
  scanf("%d",&i);
  ClearBuffer();
 }
 return i;
}

void EnterData()
{
 nodetype *p;
 
 int i,j,m,LineNumber,k;

 char StrBuffer[MAX];

 while(1)
 {
  printf(" 输入数据要插入的行号(0~~100): 输入其他的号码退出/n ");
  scanf("%d",&LineNumber);
  ClearBuffer();

  if(LineNumber< 0 || LineNumber> MAX)
  {
   printf(" 退出............./n/n");
   return;
  }
  i = LineNumber;
  Head[i].num = LineNumber;
  Head[i].next = ( nodetype *)malloc( sizeof( nodetype));
  p = Head[i].next;

  m = 1;
  j = -1;
  StrBuffer[0] = 0;
  k = 0;

  do
  {
   j++;
   if(!StrBuffer[k])
   {
    scanf("%s",StrBuffer);
    k = 0;
   }
   if(j>= DATA_MAX*m)
   {
    m++;
    p->next = (nodetype *)malloc( sizeof( nodetype));
    p = p->next;
   }
   p->Data[j%DATA_MAX] = StrBuffer[k++];

  }while(p->Data[j%DATA_MAX] != '@');

  Head[i].len = j;
 }
}

void DeleteLine()
{
 nodetype *p,*q;
 int i,j,m,LineNumber;

 while(1)
 {
  printf(" 输入数据要删除的行号(0~~100):/n ");
  scanf("%d",&LineNumber);
  
  if(LineNumber< 0 || LineNumber> MAX)
  {
   return;
  }
  i = LineNumber;
  p = Head[i].next;
  m = 0;
  
  if(Head[i].len> 0)
  {
   m = (Head[i].len-1)/DATA_MAX + 1;
  }
  for(j = 0; j<m; j++)
  {
   q = p->next;
   free(p);
   p = q;
  }
  Head[i].len = 0;
  Head[i].num = 0;
 } 
}

void List()
{
 nodetype *p;
 int i,j,m;

 for(i = 0; i<MAX; i++)
 {
  if(Head[i].len> 0)
  {
   printf(" 第%d行有数据,他们是:/n ",Head[i].num);
   m = 1;
   p = Head[i].next;

   printf("/n");

   for(j = 0; j< Head[i].len; j++)
   {
    if(j>= DATA_MAX*m)
    {
     p = p->next;
     m++;
    }
    else
    {
     printf(" %c",p->Data[j%DATA_MAX]);
     
    }
   }
   printf("/n");
  }  
 }
 printf("/n");
}

 

 

原创粉丝点击