快排C讲解、插入排序,选择排序C语言程序辅导讲解
- 首页 >> C/C++编程1.定义单链表结点类型
typedef struct _list//行表结构
{
char data[80];//记录一行字符
int length;//记录一行字符长度
struct _list *next;// 后继指针
struct _list *pre;//前趋指针
int row;//记录整篇文章的行数
}LinkList;
2.各子函数的伪码
A)、Textinput()读文件文本内容输入函数
具体创建过程如下:
a、定义LinkList指针变量*temp: LinkList *temp;
b、定义文本输入变量ch,记录文本行数变量j,记录每行字符数变量i;
c、申请动态存储空间:head->next=(LinkList *)malloc(sizeof(LinkList));
d、首行头指针的前驱指针为空:head->pre=NULL;
首行指针: temp=head->next;
首行指针的前驱指针也为空: temp->pre=NULL;
定义没输入字符时文章长度为0: temp->length=0;
初始化为字符串结束标志,防止出现乱码: for(i=0;i<80;i++)
temp->data[i]='\0';
e、从文本“abc.txt”文本文件中读取字符:
if((fp=fopen("abc.txt","r"))==NULL) /* 打开一个”abc.txt”文件*/
{
printf("not open");
exit(0);
}
利用循环进行文本输入
for(j=0;j<LINK_INIT_SIZE;j++)// 控制一页
{ for(i=0;i<80;i++) //控制一行
{ ch=fgetc(fp);
putchar(ch);//输出到屏幕
temp->data[i]=ch; temp->data[i]=ch; //给temp指向的行赋值
••••
temp->length++;//行中字符长度加1
if(ch==EOF)//文本结束符
{NUM=j; break; //文章结束时,Num来记录整个文章的行数
}}}
在字符输入的过程中,如果在单行输入的字符超过了80个字符,则需要以下操作 :
输入字符数大于80,重新分配空间建立下一行
temp->next=(LinkList *)malloc(sizeof(LinkList)) ;
给temp的前驱指针赋值:temp->next->pre=temp;
temp指向当前行: temp=temp->next;
将下一行初始化为字符串结束标志,防止出现乱码:for(i=0;i<80;i++)
temp->data[i]='\0';
记录整个文章的行数:temp->row=NUM+1;
返回指向最后一行指针:return temp;
文本输入部分到此结束。
B)、Buildtext()键盘输入文本内容输入函数
具体创建过程如下:
e、定义LinkList指针变量*temp: LinkList *temp;
f、定义文本输入变量ch,记录文本行数变量j,记录每行字符数变量i;
g、申请动态存储空间:head->next=(LinkList *)malloc(sizeof(LinkList));
h、首行头指针的前驱指针为空:head->pre=NULL;
首行指针: temp=head->next;
首行指针的前驱指针也为空: temp->pre=NULL;
定义没输入字符时文章长度为0: temp->length=0;
初始化为字符串结束标志,防止出现乱码: for(i=0;i<80;i++)
temp->data[i]='\0';
i、利用循环进行文本输入
for(j=0;j<LINK_INIT_SIZE;j++)// 控制一页
{ for(i=0;i<80;i++) //控制一行
{ ch=getchar(); //接收输入字符
temp->data[i]=ch; //给temp指向的行赋值
••••
temp->length++;//行中字符长度加1
if(ch=='#')
{NUM=j; break; //文章结束时,Num来记录整个文章的行数
}}}
在字符输入的过程中,如果在单行输入的字符超过了80个字符,则需要以下操作 :
输入字符数大于80,重新分配空间建立下一行
temp->next=(LinkList *)malloc(sizeof(LinkList)) ;
给temp的前驱指针赋值:temp->next->pre=temp;
temp指向当前行: temp=temp->next;
将下一行初始化为字符串结束标志,防止出现乱码:for(i=0;i<80;i++)
temp->data[i]='\0';
记录整个文章的行数:temp->row=NUM+1;
返回指向最后一行指针:return temp;
文本输入部分到此结束。
C)、Build()文本输入菜单函数
a、建立一个文本输入菜单;
b、通过调用文本输入函数实现文本输入的功能
D)、Displaytext()当前文本输出并写入到相应磁盘文件函数
该函数功能为将当前存储在链表中的文本信息输出在屏幕上,具体伪码算法如下:
a、定义文本行数变量j,每行字符数i:int i,j;
b、定义指针变量:LinkList *p;
c、将指针p指向链表表头: p=head->next;
d、输出链表中的信息,并写入到“bcd.txt”文本文件中
if((fp=fopen("bcd.txt","w"))==NULL){
printf("No open!\n");
exit(0);}
利用循环输出链表中信息:
for(j=0;j<=NUM&&p!=NULL;j++)
{=for(i=0;(i<80)&&(p->data[i])!='#';i++)
{=printf("%c",p->data[i]);
fprintf(fp,"%c",p->data[i]);//写入到文件
}
p=p->next; }
文本输出函数到此结束。
E)、Counttext() 文本内容统计函数
该函数是对文本中内容进行统计。具体伪码算法如下:
a、定义指针变量temp:LinkList *temp;
b、定义记录文本行数变量j,每行字符数i;
c、定义记录文本大写字母数、小写字母数、空格数、数字数、标点数和总字数的变量:
int WORD=0,word=0,space=0,num=0,punct=0,sum=0;
d、将指针temp指向链表表头:temp=head->next;
e、利用循环对链表中信息进行匹配判断,将大写字母数、小写字母数、空格数、数字数、标点数和总字数统计出来:
for(j=0;j<=NUM;j++)
{ for(i=0;(i<80)&&(temp->data[i])!='#';i++)
{ ch=temp->data[i];
if((ch>='A')&&(ch<='Z')) WORD++;
else if((ch>='a')&&(ch<='z')) word++;
else if((ch>='0')&&(ch<='9')) num++;
else if(ch==' ') space++;
else if(ch==33||ch==34||ch==39||ch==44||ch==46||ch==58||ch==59||ch==63)
{punct++;}
}
sum=WORD+word+num;
}
F)Searchtext( ) 文本内容查找函数
该函数是对文本内容进行查找并且对查找的内容进行统计其出现的次数。具体伪码算法如下:
a、定义一个数组,用来记录需要查找的字符内容:char Data[20];
b、定义定义文本行数变量j,每行字符数i,记录字符出现的次数变量:
int i,j,m=0.,sum=0;
c、对形参中定义的指针变量进行操作,使其指向链表表头:temp=head->next;
d、使用VC++中的拷贝函数,将形参中str1的值赋给Data:strcpy(Data,str1);
e、利用循环进行查找操作,核心算法为:
if((temp->data[j])==Data[k])
k++;//将输入的查找字符与链表中信息比较,找到第一个相同的字符
else if(Data[k]!='\0')
{j=j-k; k=0; } // //从主串第j-k个位置重新查找
if(Data[k]=='\0')
{sum++;//此字符出现的次数加1
j=j-k+1; //j记录下该字符串出现的位置
printf("\t\t第%d次出现在第%d行第%d列\n",l,i+1,j+1);
l++;
k=0;
continue;}
temp=temp->next; //指向下一行
对文本内容查找的部分完成。
G)、Deletetext( ) 文本内容删除函数
该函数是对文本内容进行删除。具体伪码算法如下:
f、定义一个数组用来存储需要删除的字符或者字符串:char Data[20];
g、定义指针变量:LinkList *temp,*term;
h、定义整形变量用来控制行数、字符数:int i,j,k,m,y,num;
i、使用VC++中拷贝函数讲形参中需要删除的字符或字符串赋值给已定义的数组:
strcpy(Data,str2);
j、使用循环进行删除操作:
其核心算法为:
for(i=0;i<=NUM;i++)
{ for(j=0;j<80;j++)
{ if((temp->data[j])==Data[k]) k++;
else if(Data[k]!='\0') {j=j-k;k=0;}
if(Data[k]=='\0')
{num=j;break; } }
if(num<80) break;
}
首先是使用循环查找到需要删除字符或者字符串的字符数以及字符或者字符串的位置,以便于删除;
for(;i<=NUM;i++)
{ for(;j<80;j++)
{ if(j+1<k)
{ term->data[80-k+num]=temp->data[j+1]; } //删除的字符串不在最后一行,将下一行的字符(由temp指向)前移到前行
else temp->data[j-k+1]=temp->data[j+1];} //当要删除的字符串在最后一行只要将最后一行的字符前移
term=temp;
temp=temp->next;
j=0;}//在使用循环,从查找到的字符或者字符串开始进行删除,在一行删除完毕之后,转至下一行进行删除。
删除部分到次完成。
H)、Inserttext() 文本内容插入函数
该函数为向文本中插入字符或者字符串。具体伪码如下:
a、定义需要插入的字符或者字符串的输入数组:char Data[20];
b、定义需要插入的字符或者字符串的插入的行和列:int h,l;
c、进行输入操作,将上述两个部分进行输入
d、定义一个整形变量,确定插入的具体位置: int i=(h-1)*80+l;
e、定义一指针变量:LinkList *a;
f、对输入的字符进行插入操作,具体核心算法如下:
int n=strlen(Data);
int m ;
int insertRow=i/80+1;//确定插入位置的行数
int row=temp->row;//将全局变量记录的行数赋值给row
int j;
if(insertRow==row)//判断插入位置是否在最后一行
{for(m=temp->length-1;m>=(i%80)&&n>0;m--)
temp->data[m+n]=temp->data[m];//将最后一行插入位置后面的所有字符向后移n位
for(m=(i%80),j=0;m<n+(i%80);m++,j++)
{temp->data[m]=Data[j];}//将要插入的字符或者字符串赋值到要插入的位置
}
else//如果插入的位置不再最后一行
{int r=0;
for(int p=insertRow; p<row;p++)
{if(p == insertRow) r=0;
else r=n;
for(m=temp->length-1-r;m>=0&&n>0;m--)
temp->data[m+n]=temp->data[m];//将最后一行整体后移n位
a= temp;//p指向前一行
temp = temp->pre;//temp指向前一位
temp->length = 80;
for(m = temp->length-n,j=0;m<temp->length;m++,j++)
a->data[j]=temp->data[m]; }//将前一行后n个字符移到下一行的前n个字符位置
for(m=temp->length-n-1;m>=(i%80);m--)
temp->data[m+n]=temp->data[m];//插入行位置后的字符后移n位
for(m=(i%80),j=0;m<(i%80)+n;m++,j++)
temp->data[m] =Data[j];}//将要插入的字符赋值到插入的位置
return temp;}
I)、Bmenu()文本内容处理菜单
该函数为文本内容处理菜单,即使用循环语句对文本内容处理部分的子函数集中在此函数中。
J)、Welcome()是将一标题输出在DOS节面的最上端;
K)、menu() main()
主菜单函数以及主函数;将主菜单单独创建为一个子函数,方便观看。仍然是很简单的循环语句实现。
主函数为:
void main()
{head=(LinkList *)malloc(sizeof(LinkList));
LinkList *temp;
menu(temp);
}
先为head申请存储空间,然后创建指针变量temp,然后直接在主菜单函数中进行其他操作。