请教高手:帮忙看一下,急~~建立链表,文件写入链表并printf打印出来??
//循环双向链表 排序 数据源(文件读取)结果//建立一个双向循环链表,把文件里的数据读到链表中,链表降序排序并用printf打印出来。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <ctype.h>
#define SIZE 5
#define LEN sizeof(struct d_list)
struct d_list
{
int data;
struct d_list *prior;
struct d_list *next;
}* head;
#if 0
void create_d_list ( struct d_list **headp, int *p )
{
struct d_list *head = NULL, *tail;
if( p[0] == 0 )
*headp = NULL;
else
{
head = tail = ( struct d_list * ) malloc ( LEN );
//head->data = *p++;
head->data = *p;
tail = head;
printf("head->data = %d\t",head->data);
//while( *p )
while ( head->data != 0 )
{
tail->next = ( struct d_list * ) malloc ( sizeof (struct d_list) );
tail->next->prior = tail;
tail = tail->next;
tail->data = *p;
}
printf("tail->data = %d\n",tail->data);
tail->next = head;
head->prior = tail;
}
*headp = head;
}
#endif
/*创建双向循环链表
*函数名:create_d_list
*参数:n:带n个结点
*返回值:链表头指针 */
struct d_list * create_d_list(int n)
{
struct d_list *p, *s;
int i;
p = head = ( struct d_list * ) malloc ( LEN );
for( i = 1; i <= n; i++ )
{
s = ( struct d_list * )malloc( LEN );
//scanf( "%d", &s->data );
s->prior = p;
p->next = s;
p = s;
}
p->next = head; head->prior = p;
return head;
}
/*解析内容
*函数名: spit
*参数:buf:要分解的字符串;q:分隔符字符串
*返回值:0:成功; 1:失败 */
int spit( unsigned char *buf )
{
char *p, *q = ",";
int n;
p = strtok( buf, q );
//printf( "%s %d\n",__FILE__,__LINE__ );
while( p != NULL )
{
printf( "%s\n", p );
create_d_list(n);
p = strtok( NULL, q );
//printf( "%s %d\n",__FILE__,__LINE__ );
printf( "%s\n", p );
p = strtok( NULL,q );
}
//printf( "%s %d\n",__FILE__,__LINE__ );
return 0;
}
/*写文件
*函数名:write_buf
*参数:filename:文件名; buf:存入数据的首地址; len:数据块的字节数
*返回值:成功:len; 失败:0 */
int write_buf( char *filename, unsigned char *buf, int len )
{
int ret,handle;
char msg[20];
if( filename == NULL || buf == NULL )
return -1;
if((handle = open("file1", O_RDWR)) == -1 )
{
printf( "cannot open the file\n" );
return -2;
}
//ret = write( handle, dlist, sizeof( dlist ) );
ret = write( handle, msg, strlen(msg) );
if( ret != 1)
printf( "write error\n" );
close(handle);
return ret;
}
/*遍历双向循环链表 写文件
*函数名:disp_d_list
*参数: p1:结构体类型的指针
*返回值:无 */
void disp_d_list ( struct d_list *p1 )
{
struct d_list *p = p1;
char buffer[50];
//int i=1;
int handle;
if( (handle =open("file1",O_RDWR)) == -1 )
return;
do{
memset( buffer, 0x00, sizeof(buffer) );
sprintf( buffer, "%d", p1->data);
//write( handle,buffer,strlen(buffer) );
/*if( ((i % 4) == 0) )
write( handle,"\n",1 );
i++;*/
//printf( "%d\n", p->data );
p = p->next;
} while( p != p1 );
//write_buf( stream, buffer, strlen(buffer) );
close(handle);
}
/*读一行
*函数名:readn
*参数: fd:文件句柄; buf:存入数据的首地址
*返回值: i */
ssize_t readn( int fd, char *buf )
{
int len = 0, i = 0;
while( 1 )
{
if( (len = read( fd, &buf[i], 1 ) ) <= 0 )
return len;
//if( buf[i] == '\n' )
if( buf[i] == 0x0D ) //ASCII=13,回车,将当前位置移到本行开头
break;
i++;
}
printf( "%s buf = %s\n", __func__, buf );
return i;
}
/*读文件(读内容、解析内容)
*函数名:Get_File_Content
*参数: filename
*返回值: 成功 0; 失败 -1 */
int Get_File_Content( char *filename )
{
char buf[8192];
int handle;
//int m, k;
if( filename == NULL )
return -1;
if( ( handle = open( filename, O_RDWR ) ) == -1 )
return -1;
memset( buf, 0x00, sizeof(buf) );
//printf( "%s %d\n",__FILE__,__LINE__ );
while( 1 )
{
int len;
if( (len = readn ( handle, buf )) > 0 )
spit( buf );
else
break;
//sleep(1);
#if 0
for( m = 0; m < k; m++ )
if( buf[m] >= '0' && buf[m] <= '9' )
printf("%c",buf[m]);
printf( "\n" );
#endif
}
//printf( "%s %d\n",__FILE__,__LINE__ );
close( handle );
return 0;
}
/*双向循环链表降序排列
*函数名:sort_d_list
*参数:
*返回值: */
void sort_d_list( struct d_list **headp1 )
{
struct d_list *p, *q;
int i,j,k,n = 0;
p = *headp1;
//printf( "%s %d\n",__FILE__,__LINE__ );
while( p != (*headp1)->prior )
{
n++;
p = p->next;
}
//printf( "%s %d\n",__FILE__,__LINE__ );
for( i = 0, p = *headp1; i < n; p = p->next, i++ )
for( j = i, q = p->next; j < n; q = q->next, j++ )
if( (p->data) < (q->data) )
{
k = q->data;
q->data = p->data;
p->data = k;
}
}
int main( int argc, char *argv[] )
{
Get_File_Content( "num" );
sort_d_list( &head );
disp_d_list( head );
return 0;
}
[[it] 本帖最后由 henyue 于 2008-8-22 12:37 编辑 [/it]]