链表代码
- 循环链表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);
}
- 循环链表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);
}
字符串
.字符串处理函数
- 字符串整行输入函数gets()
格式:gets(字符数组)
功能:从键盘将带空格的字符序列(以回车键结束)全部输入到指定的字符数组中,并自动加字符串结束符“\0”。该函数的返回值是字符数组的首地址。
-
字符串整体输出函数puts()
格式:puts(字符串)
功能:将指定的字符串(以“\0”结束)作为一行输入到终端。
puts(str)与printf("%s\n",str)功能相同。str可以是字符串常量或有“\0”的字符数组,字符串中可以有转义字符。 -
测字符串长度函数
格式:strlen(字符串)
功能:返回字符串有效长度,不包括"\0"。 -
字符串比较函数
格式:strcmp(字符串1,字符串2)
功能:字符串比较,返回比较结果。它对字符串1和字符串2中的字符从左到右逐个按其ASCII码值进行比较,知道字符值不相等或遇到字符串结束符"\0"时结束。如果两个字符串相等,则函数返回整数0;如果两个字符串不相等,且字符串1的字符较大,则返回正整数,否则返回负整数。(大写字母比相应小写字母的ASCII码值小32) -
字符串复制函数
格式:strcmp(字符数组1,字符串2)
功能:将字符串2包括"\0"全部复制到字符数组1中,字符串2可以是字符串常量或字符数组名,而字符数组1只能是字符数组名。函数的返回值是字符数组1的首地址。(字符数组必须足够大,保证能够放的下字符串2) -
字符串连接函数
格式:strcat(字符数组1,字符串2)
功能:将字符串2链接到字符数组1中的字符串的后面,字符串2可以是字符串常量或字符数组名,而字符数组1只能是字符数组名。此函数的返回值是字符数组1的首地址。
字符数组1必须足够大,以便能放得下加在后面的新的字符串。连接时字符数组1中的字符串结尾的"\0"被覆盖,;两个字符串链接为一个,在字符数组中只保留新字符串后的"\0"。
字符数组的定义格式
- 初始化时如果元素最初值列表给出的字符数小于定义的元素数,则后面自动补ASCII码为0的字符"\0",在字符串处理中字符"\0"作为字符串结束符。如果给出的字符数大于数组元素数,则编译时出现语法错误。
- 可去掉定义时的元素数,用元素初值列表的元素个数来定义元素数。(这种情况下,后面不会自动加"\0")
- 用字符串常量对比字符数组初始化,将字符串常量放在初始化的花括号内或直接放在"="后面。
字符数组的输入与输出
%c—逐个元素输入和输出字符(char)
%s—整体一次输入和输出字符串(string)
- %c输入
输入时数组元素前一定要加地址符&
(这个方法输入时系统不会自动加"\0",输出时也不会自动检测"\0") - %s 输入
输入时直接用数组名作输入项整体输入字符串。
(
- 数组名本来就是该数组的首地址(0号元素的地址),所以scanf()中输入项的数组名前不允许再加取地址符&。
- 由于是整体输入,所以在输入字符串的末尾,系统会自动加上"\0"。
- 输入多个字符串,可用空格隔开。
)
- %s整体输出字符数组
- 如果数组长度大于字符串指定长度,则遇到"\0"即结束。
- 如果数组中有多个"\0",输出时遇到的第一个"\0"即结束。
- 如果数组中没有"\0",用此格式输出数组是会将内存中该数组之后的内容一并输出,直到遇见第一个"\0"时结束。最好改用"%c"格式输出数组中各元素。
- 只有字符串数组可以整体输入输出,其他类型的数组都不行。
补充
- strlwr(字符串)将字符串大写字母转换为小写,返回该串的首地址
- strupr(字符串)将字符串的小写字母改为大写,返回该串的首地址
- 带有空格的字符串不能用scanf()函数一次性输入,它在遇到第一个空格时即停止了。