循环链表(单双向),字符串相关知识点

这篇博客介绍了C语言中关于循环链表和字符串的基本操作,包括循环链表的实现、字符串处理函数如gets()、puts()、strlen()、strcmp()、strcpy()、strcat()的功能和使用方法,以及字符数组的初始化、输入输出规则。此外,还提到了字符串大小写的转换函数strlwr()和strupr()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链表代码

  1. 循环链表1
#include<stdio.h>
#include<stdlib.h>

typedef struct _node{
	int num;
	struct _node *next;
}Node;
typedef struct{
	Node *head;
	Node *tail;
}List;

void add(List *plist)
{
	plist->tail=plist->head;
	while(1)
	{
		Node *p=(Node *)malloc(sizeof(Node));
		scanf("%d",&p->num);
		p->next=NULL;
		if(p->num==-1)
		{
			free(p);
			break;
		}
		plist->tail->next=p;
		plist->tail=p;
	}
	plist->tail->next=plist->head->next;
	free(plist->head);
	plist->head=plist->tail->next;
}

void print(List *plist)
{
	Node *p;
	p=plist->head;
	while(1)
	{
		printf("%d--",p->num);	
		if(p->next==plist->head)
		{
			printf("\n");
			break;
		}
	
		p=p->next;
	}
	
}

void clean_up(List *plist)
{
	Node *p;
	Node *q;
	p=plist->head;
	q=plist->tail;
	while(1)
	{
		if(p==q)
		{
			free(p);
			break;
		}
		q->next=p->next;
		free(p);
		p=q->next;
	}
}




int main()
{
	List list;
	list.head=(Node *)malloc(sizeof(Node));
	list.tail=NULL;
	add(&list);

	print(&list);
	clean_up(&list);
}

  1. 循环链表2
#include<stdio.h>
#include<stdlib.h>

typedef struct _node{
	int num;
	struct _node *next;
	struct _node *last;
}Node;
typedef struct {
	Node *head;
	Node *tail;
}List;

void add(List *plist)
{
	plist->tail=plist->head;
	while(1)
	{
		Node *p=(Node *)malloc(sizeof(Node));
		scanf("%d",&p->num);
		if(p->num==-1)
		{
			free(p);
			break;
		}
		p->next=NULL;
		
		p->last=plist->tail;
		plist->tail->next=p;
		plist->tail=p;
	}
	plist->tail->next=plist->head->next;
	free(plist->head);
	plist->head=plist->tail->next;
	plist->head->last=plist->tail;
}

void print(List *plist)
{
	Node *p;
	p=plist->head;
	while(1)
	{
		printf("%d--",p->num);
		if(p->last==plist->head)
		{
			break;
		}
		p=p->last;
	}
}


void clean_up(List *plist)
{
	Node *p=plist->head;
	Node *q=p->next;
	while(1)
	{
		if(p->last==p)
		{
			free(p);
			break;
		}
		q->last=p->last;
		p->last->next=q;
		free(p);
		p=q->last;
	}
}


int main()
{
	List list;
	list.head=(Node *)malloc(sizeof(Node));
	list.head->next=list.head->last=NULL;
	list.tail=NULL;
	
	add(&list);
	print(&list);
	clean_up(&list);
}

字符串

.字符串处理函数

  1. 字符串整行输入函数gets()

格式:gets(字符数组)
功能:从键盘将带空格的字符序列(以回车键结束)全部输入到指定的字符数组中,并自动加字符串结束符“\0”。该函数的返回值是字符数组的首地址。

  1. 字符串整体输出函数puts()
    格式:puts(字符串)
    功能:将指定的字符串(以“\0”结束)作为一行输入到终端。
    puts(str)与printf("%s\n",str)功能相同。str可以是字符串常量或有“\0”的字符数组,字符串中可以有转义字符。

  2. 测字符串长度函数
    格式:strlen(字符串)
    功能:返回字符串有效长度,不包括"\0"。

  3. 字符串比较函数
    格式:strcmp(字符串1,字符串2)
    功能:字符串比较,返回比较结果。它对字符串1和字符串2中的字符从左到右逐个按其ASCII码值进行比较,知道字符值不相等或遇到字符串结束符"\0"时结束。如果两个字符串相等,则函数返回整数0;如果两个字符串不相等,且字符串1的字符较大,则返回正整数,否则返回负整数。(大写字母比相应小写字母的ASCII码值小32)

  4. 字符串复制函数
    格式:strcmp(字符数组1,字符串2)
    功能:将字符串2包括"\0"全部复制到字符数组1中,字符串2可以是字符串常量或字符数组名,而字符数组1只能是字符数组名。函数的返回值是字符数组1的首地址。(字符数组必须足够大,保证能够放的下字符串2)

  5. 字符串连接函数
    格式:strcat(字符数组1,字符串2)
    功能:将字符串2链接到字符数组1中的字符串的后面,字符串2可以是字符串常量或字符数组名,而字符数组1只能是字符数组名。此函数的返回值是字符数组1的首地址。
    字符数组1必须足够大,以便能放得下加在后面的新的字符串。连接时字符数组1中的字符串结尾的"\0"被覆盖,;两个字符串链接为一个,在字符数组中只保留新字符串后的"\0"。

字符数组的定义格式

  1. 初始化时如果元素最初值列表给出的字符数小于定义的元素数,则后面自动补ASCII码为0的字符"\0",在字符串处理中字符"\0"作为字符串结束符。如果给出的字符数大于数组元素数,则编译时出现语法错误。
  2. 可去掉定义时的元素数,用元素初值列表的元素个数来定义元素数。(这种情况下,后面不会自动加"\0")
  3. 用字符串常量对比字符数组初始化,将字符串常量放在初始化的花括号内或直接放在"="后面。

字符数组的输入与输出

%c—逐个元素输入和输出字符(char)
%s—整体一次输入和输出字符串(string)

  1. %c输入
    输入时数组元素前一定要加地址符&
    (这个方法输入时系统不会自动加"\0",输出时也不会自动检测"\0")
  2. %s 输入
    输入时直接用数组名作输入项整体输入字符串。
    (
  • 数组名本来就是该数组的首地址(0号元素的地址),所以scanf()中输入项的数组名前不允许再加取地址符&。
  • 由于是整体输入,所以在输入字符串的末尾,系统会自动加上"\0"。
  • 输入多个字符串,可用空格隔开。
    )
  1. %s整体输出字符数组
  • 如果数组长度大于字符串指定长度,则遇到"\0"即结束。
  • 如果数组中有多个"\0",输出时遇到的第一个"\0"即结束。
  • 如果数组中没有"\0",用此格式输出数组是会将内存中该数组之后的内容一并输出,直到遇见第一个"\0"时结束。最好改用"%c"格式输出数组中各元素。
  • 只有字符串数组可以整体输入输出,其他类型的数组都不行。

补充

  1. strlwr(字符串)将字符串大写字母转换为小写,返回该串的首地址
  2. strupr(字符串)将字符串的小写字母改为大写,返回该串的首地址
  3. 带有空格的字符串不能用scanf()函数一次性输入,它在遇到第一个空格时即停止了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值