當前位置:編程學習大全網 - 編程語言 - 如何用c語言做記事本

如何用c語言做記事本

#include<stdio.h>

#include<malloc.h>

#include<string.h>

#include<stdlib.h>

#include<ctype.h>

#define NULL 0

#define MAX 100

typedef struct lnode{

char date[MAX]; //存放數據

struct lnode * prior ; //前驅

struct lnode * next ; //後繼

int number ; //記錄壹個節點的字符數!如果是頭節點就記錄他的節點個數

int quese ; //記錄節點在鏈表中的位置

}lnodetype;

lnodetype * l ; //設置兩個全局變量,分別是頭節點指針和尾節點指針

lnodetype * end ;

//**********這個函數是用來初始化的**********//

int iniatelist (lnodetype ** l , lnodetype ** end)

{

(*l) = (lnodetype *)malloc (sizeof (lnodetype) ) ;

if ( (*l) == NULL )

{

printf ("沒有只夠的內存空間!程序即將退出!");

return 0 ;

}

(*l)->prior =(*l)->next = NULL ; //這是雙鏈表

(*l)->number = (*l)->quese = 0;

(*end) = (*l) ;

printf ("程序初始化完畢!");

return 0;

}

//**********這個函數是用來建立節點,並且插入元素的**********//

int link(lnodetype ** l, lnodetype ** end)

{

lnodetype *s ;

s = (lnodetype *)malloc ( sizeof (lnodetype) ) ;

if ( s == NULL ){

printf ("內存空間不夠,程序即將退出!") ;

return 0 ;

}

(*end)->next = s ;

s->prior = (*end) ;

(*end) = (*end)->next ;

(*l)->number++ ; //增加壹個節點,頭節點的number就加1

s->quese = (*l)->number ; //這個是記錄節點在鏈表中的位置

printf ("%d行", s->quese ) ; //這個是節點在整個鏈表中的位置

gets(s->date) ;

s -> number = strlen(s->date) ;

return 0 ;

}

//**********這個是打印鏈表的函數**********//

int prin (lnodetype ** l, lnodetype ** end)

{

lnodetype * p ;

int i ;

int j = 0;

int couter = (*l)->number ;

p = (*l)->next ;

for (i=0; i < couter; i++){

printf ( "%d行" , i+1 ) ;

j = 0;

while ( ( p->date[j]>='a' && p->date[j]<='z') ||

(p->date[j]>='A' && p->date[j]<='z') ||

p->date[j]>='0' && p->date[j]<='9')

{

printf ( "%c" , p->date[j] ) ;

j++ ;

}

printf ("n") ;

p = p->next ;

}

return 0 ;

}

//*********這個查找和編輯相應行的函數**********//

int search (lnodetype ** l, lnodetype ** end )

{

int number ;

scanf ("%d" , &number) ;

int i ;

lnodetype * p ;

p = (*l)->next ;

for ( i=0; i<number-1; i++ )

p = p->next ;

printf ("%d行" , number ) ;

gets (p->date) ;

return 0 ;

}

//**********這個是在文本文件裏搜索字符串的函數**********//

int searchstr(lnodetype ** l , lnodetype ** end)

{

char ptr[100] ;

int arrycouter ;

int mystrcmp( char *, char * , int ) ;

printf ( "ok!現在輸入妳查找的字符串!" ) ;

scanf ( "%s" , ptr ) ;

arrycouter = strlen (ptr) ;

lnodetype * s ;

s = (*l)->next ;

char * p ;

int i = 1 ;

int couter = 0 ;

int number = (*l)->number ;

p = (char *)s->date ;

while ( i && number ){

// i=1是,證明沒有找到,向第二個節點繼續尋找

while ( i && ( ( (*p >= 'a') && (*p <= 'z') ) || ( (*p >= 'A') && (*p <= 'Z') ) ) ){

i = mystrcmp ( p , ptr , arrycouter );

if ( i == 1 ){

printf ("字符串已經在第%d行,第%d個字符開始,",s->quese, couter+1 );

i = 0 ;

}

else

{

p++ ;

couter++;

i = 1 ;

}

}

s = s->next ;

p = (char *)s->date ;

number -- ;

}

if ( i == 1 )

printf ("字符串在本文檔中不存在!");

return 0 ;

}

//**********(1)這個函數是用來實現退出不保存功能的**********//

int exitunsave(lnodetype ** l, lnodetype ** end)

{

lnodetype * s ;

while( (*l) != (*end) ){ //如果不保存的話,最好是把節點的空間都釋放,節省空間

s = (*end) ;

(*end) = (*end)->prior ;

free( s ) ;

}

return 0 ;

}

//**********(2)這個函數是用來實現退出但保存功能的**********//

int quitandsave( lnodetype ** l , lnodetype ** end )

{

FILE * fp ;

char ch ;

char filename[20] ;

lnodetype * p;

int i ;

int j ;

int couter = (*l)->number ;

p = (*l)->next ;

printf ("請輸入文件名:") ;

scanf ("%s" , filename ) ;

if ( (fp = fopen( filename , "w" )) == NULL ){

printf ("文件不能打開!n");

return 0 ;

}

for ( i=0; i<couter; i++ ){ //有幾個節點就進行多少次的存貯

ch = p->date[0] ;

j = 1 ;

while (ch != '\0'){

fputc (ch , fp) ;

ch = p->date[j] ;

j++ ;

}

p = p->next ;

fputc ( '#' , fp ) ; //註意在每個節點的後面加上結束的符號

}

fputc ( '@' , fp ) ; //整個文件關閉的標誌

fclose ( fp ) ; //註意關閉文件,

return 0 ;

}

//**********由於庫函數比較字符串提供的功能不滿足要求,故自己寫了壹個**********/

int mystrcmp( char * p ,char * sour ,int number )

{

while ( number && (*p) == (*sour) &&

( ( (*p >= 'a') && (*p <= 'z') ) || ( (*p >= 'A') && (*p <= 'Z') ) )){

p++ ;

sour++ ;

number-- ;

}

if ( number == 0 )

return 1 ;

else

return 0 ;

}

//**********這個函數是用來實現統計字符串功能的**********//

int coutword(lnodetype ** l , lnodetype ** end)

{ //考慮到只統計壹行的單詞沒有意義,故統計整個文本

int yes = 1 ; //這個是進入單詞的標誌

int no = 0 ; //在單詞外面的時候的標誌

int i , j ,inaword ,count = 0 ;

inaword = no ;

lnodetype * s = (*l)->next ;

for (j=0; j<(*l)->number; j++){

for ( i=0; (s->date[i]>='a' && s->date[i]<='z') ||

(s->date[i]>='A' && s->date[i]<='z') ||

(s->date[i]>='0' && s->date[i]<='9' ) ||

(s->date[i]==' '); i++ )

{

if ( s->date[i] == ' ' )

inaword = no ;

else

if ( inaword == no )

{

inaword = yes ;

count++ ; //計算單詞

}

}

s = s->next ;

inaword = 0 ; //註意這裏,把標誌置為0了!

}

printf ( "n文本壹***有 %d 行" , (*l)->number ) ;

printf ("n此文本壹***有 %d 個單詞!" , count ) ;

return count ;

}

//**********這個函數是用來實現計算文本行數功能的**********//

int linecouter(lnodetype ** l , lnodetype ** end )

{

int couter ;

couter = (*l)->number ;

return couter ;

}

//**********這個函數是整和壹上所有功能的菜單函數**********//

int editmenu(lnodetype ** l , lnodetype ** end )

{

char choice ;

char * p = "cls" ;

int i = 1 ; //這兩個變量是用來控制循環的

int j= 1 ;

system (p) ;

prin (&(*l) , &(*end)) ;

while (j){

printf ("*********************************** e: 編輯相應行 *************************************n") ;

printf ("*********************************** s: 搜索字符串 *************************************n") ;

printf ("*********************************** t: 統計單詞個數 ***********************************n") ;

printf ("*********************************** q: 退出編輯 ***************************************n") ;

scanf("%c",&choice);

scanf("%c" , &choice) ; //莫名其妙的問題,非要兩個請求輸入語句才肯停下來!

switch (choice)

{

case 'e' : {

i = 1 ;

while (i)

{

search( &(*l) , &(*end) );

system (p) ;

prin( &(*l) , &(*end) ) ;

printf ("n1 繼續編輯 0 結束編輯n") ;

scanf ("%d" , &i) ;

}

}

break;

case 's' : {

i = 1 ;

while (i)

{

searchstr( &(*l) , &(*end) );

getchar();

getchar();

system (p) ;

prin( &(*l) , &(*end) ) ;

printf ("n1 繼續搜索 0 結束搜索n") ;

scanf ("%d" , &i) ;

}

}

break;

case 't' : {

coutword ( &(*l) , &(*end) ) ;

getchar() ;

}break;

default : return 0 ;

}

system (p) ;

prin( &(*l) , &(*end) ) ;

printf ("n1 回到編輯菜單 0 結束編輯n") ;

scanf ("%d" , &j) ;

if (j == 1)

system (p) ;

else

return 0 ;

}

return 0 ;

}

//**********實現第壹個模塊:新建空白文檔**********//

int newtext( lnodetype ** l ,lnodetype ** end )

{

printf ( "新文本文件:n" ) ;

int i = 1 ;

char judstr[MAX] ;

lnodetype * temp ;

char jud ;

char * p = "cls" ;

while ( 1 ){

link( &(*l) , &(*end) ) ;

jud = (*end)->date[0] ;

if ( jud == '5' ){ //輸入‘5’結束壹切

temp = (*end) ;

(*end) = (*end)->prior ;

free (temp) ;

while (1){

printf ( "******************************* out :退出不保存 ****************************n") ;

printf ( "******************************* edit :編輯信息 *****************************n") ;

printf ( "******************************* quit :退出而不存盤 **************************n") ;

printf ( "******************************* qas :退出且存盤 ****************************n") ;

printf ( "******************************* con :繼續輸入! *****************************n") ;

gets(judstr) ;

if ( !strcmp(judstr , "out") )

{

exitunsave( &(*l) , &(*end) ) ;

return 0 ;

}

else

if ( !strcmp(judstr , "qas") )

{

quitandsave( &(*l) , &(*end) ) ;

return 0 ;

}

else

if ( !strcmp(judstr , "edit") )

{

editmenu (l , end) ;

return 0;

}

system (p) ;

}

return 0 ;

}

}

return 0 ;

}

//**********這個是裝入文件的函數**********//

int loadtaxt( char * filename )

{

FILE * fp ;

lnodetype * l ;

char ch ;

int i = 0 ;

char * p = "cls" ;

char judstr[MAX] ;

lnodetype * head ;

lnodetype * end ;

iniatelist ( &head , &end) ;

l = end = head ;

if ( (fp = fopen( filename, "r+")) == NULL ){

printf ("文件不能打開!n") ;

return 0 ;

}

ch = fgetc ( fp ) ;

while ( ch != '@' ){

lnodetype *s ;

s = (lnodetype *)malloc ( sizeof (lnodetype) ) ;

if ( s == NULL ){

printf ("內存空間不夠,程序即將退出!") ;

return 0 ;

}

end->next = s ;

s->prior = end ;

end = end->next ;

l->number++ ;

s->quese = l->number ;

printf ("%d行", s->quese ) ;

while ( ch != '#'){

s->date[i] = ch ;

ch = fgetc (fp) ;

i++ ;

}

i = 0;

while ( (end->date[i]>='a' && end->date[i]<='z') ||

(end->date[i]>='A' && end->date[i]<='z') ||

(end->date[i]>='0' && end->date[i]<='9' ) ||

(end->date[i]==' ') )

{

printf ( "%c" , end->date[i] ) ;

i++ ;

}

end->date[i] = '\0' ; //註意在節點的最好加上這個,以讓退出保存功能函數知道此節點已結束

printf ( "n" ) ;

i = 0;

ch = fgetc ( fp ) ;

}

fclose (fp) ;

printf ("n文件成功裝入!n") ;

while (1){

printf ( "******************************* out :退出不保存 ****************************n") ;

printf ( "******************************* edit :編輯信息 *****************************n") ;

printf ( "******************************* qas :退出且存盤 ****************************n") ;

printf ( "******************************* con :繼續輸入! *****************************n") ;

scanf("%s",judstr);

if ( !strcmp(judstr , "out") )

{

exitunsave( &l , &end ) ;

return 0 ;

}

else

if ( !strcmp(judstr , "qas") )

{

quitandsave( &l , &end ) ;

return 0 ;

}

else

if ( !strcmp(judstr , "edit") )

{

editmenu (&l , &end) ;

return 0 ;

}

system (p) ;

}

return 0 ;

}

//**********主函數**********//

void main ( void )

{

//iniatelist (&l , &end) ;

//newtext(&l , &end) ;

char filename[MAX] ;

scanf ( "%s" , filename ) ;

loadtaxt( filename ) ;

}

  • 上一篇:怎麽備教案啊?
  • 下一篇:編程羅夏
  • copyright 2024編程學習大全網