天天看点

输入一串数字s字符串,假设字符串长度不超过40个字符,数据间用空格隔开,把字符串里数字字符转化为对应的数字,每个数字存在一个单向动态链表中的一个节点里。

问题表述

已知:输入一串数字s字符串,假设字符串长度不超过40个字符,数据间用空格隔开,把字符串里数字字符转化为对应的数字,每个数字存在一个单向动态链表中的一个节点里,函数原型如下:

struct number * create_number_list(char a) //生成动态链表,输出节点的数量

*struct number{int c;struct number next} //节点结构

话不多说直接上代码

主函数

int main()
{
 char s[100];
 char list[40][40];
 printf("enter string:\n");
 gets(s);
 depart(s,list);
 struct number *node=create_number_list(s,list);
 printf("these numbers are:\n");
 while(node->next!=NULL)
 {
  printf("%4d",node->c);			//顺序输出每一个节点的值
  node=node->next;
 }
 printf("\nThere are %d numbers.",count);
 return 0;
}
           

分割字符串函数如下

void depart(char str[],char list[40][40])	//将分割的数字存入二维字符数组中
{
 int i=0;
 char *substr=strtok(str," ");		//第二个参数是分隔符
 while(substr)
 {
  strcpy(list[i],substr);
  i++;
  count++;		//全局变量,记录数字的个数
  substr=strtok(NULL," ");
 }
}
           

其中涉及strtok()函数的用法,可以看看这篇博客strtok()用法

数字字符串转换成整形

int StringToInt(char s[])
{
 char *p=s;
 int priceNum=0;
 while(*p)
 {
  priceNum*=10;
  priceNum+=*p-'0';
  p++;
 }
 return priceNum;
}
           

不懂可以看这篇数字字符串转换成整形

接下来是创建动态链表,把转换后的数存入每一个节点中

struct number* create_number_list(char *a,char str[40][40])
{
 int i=0;
 number *p1,*p2,*head;
 head=p1=(number *)malloc(sizeof(number));
 p1->c=StringToInt(str[i]);
 while(i<count)
 {
  p2=(number *)malloc(sizeof(number));
  p1->next=p2;
  p1=p2;
  i++;
  p1->c=StringToInt(str[i]);	//调用转换函数,对节点中的c赋值
 }
 p2->next=NULL;
 return head;	//返回头指针
}
           

运行结果

输入一串数字s字符串,假设字符串长度不超过40个字符,数据间用空格隔开,把字符串里数字字符转化为对应的数字,每个数字存在一个单向动态链表中的一个节点里。

继续阅读