
-->Am 11:11 的相册 <-- -->Am 11:11 的网上硬盘<--
LINUX链表的实现
最近有兴接触到LINUX 和 UNIX 平台,所来无事,便静下心看数据结构,对里面的一些内容进行巩固.
经过1.5天的时间才把链表的头绪整明白.没有办法,人叫那个笨呀...
下面附上UNIX下的c 代码吧.
编译:cc -g a.c
调试:dbx a.out 或者 gdb a.out
嘿嘿,当然直接在C下面编译应该是可以的,因为没有用到特别的库,应该可以通用编译.
#i nclude <stdio.h>
#i nclude <stdlib.h>
//定义链表结构
typedef struct _list
{
char *str;
struct _list *up;
struct _list *down;
}*Plist,Tlist;
int listcount=0; //项目数量
Plist phead,ptail,ptemp; //临时变形指针
int ladd(char *str); //增加一个内容方法
void disp(); //显示所有内容
void freel(); //释放所有内容
int delete(int n); //删除指定位置的内容
int getcount(); //返回总的数量
void main()
{
ladd("a\n"); //增加一个内容
ladd("b\n"); //增加一个内容
ladd("c\n"); //增加一个内容
delete(2); //删除编号为2的内容
printf("%d\n",getcount()); //显示当前数量
disp(); //显示所有
freel(); //释放所有
}
int ladd(char *str)
{
ptemp=(Plist)calloc(sizeof(Tlist),1); //申请1个大小的内存
ptemp->str=(char*)calloc(sizeof(char),strlen(str)+1); //动态申请字符长度
strcpy(ptemp->str,str); //写入内容
if (phead==NULL) //如果头指针为空
{
phead=ptail=ptemp; //头/尾=临时
phead->down=ptail; //把头的上 下 地址修正
phead->up=NULL;
}
else
{
ptail->down=ptemp; //尾的下一个 是当前的内容
ptemp->up=ptail; //当前的上一个 是尾
ptemp->down=NULL; //当前的下一个是空
ptail=ptemp; //尾修正为当前的内容
}
listcount++; //数量增1
return 1; //返回
}
void disp()
{
Plist o=phead; //从首开始显示
while(1)
{
printf("%s",o->str); //显示
if (o->down==NULL) break; //如果到尾部则退出
o=o->down; //定位到 当前内容的下一个
}
}
void freel()
{
Plist o=phead; //从首开始释放
Plist T;
while(1)
{
free(o->str); //先释放字符部分
T=o->down; //保存下一个内容的地址
free(o); //释放当前对象
if (o->down==NULL) break; //如果释放完成则退出.. 这里好像应该是 if (T==NULL) break;
o=T; //重新当前内容
}
}
int getcount()
{
return listcount; //返回当前总数量
}
int delete(n)
{
Plist o=phead; //从首开始查找
n--;
if (n<0 && n>listcount) return 0; //如果参数在指定范围内
while(n--)
{
o=o->down; //移动到指定位置.
}
o->up->down=o->down; //当前对象上一个对象的下一个对象变成当前对象的下一个对象.
o->down->up=o->up; //当前下一个对象的上一个对象牙塔变成当前对象的上一个对象.
free(o->str); //释放当前对象字符
free(o); //释放当前对象
listcount--; //数量减1
return 1; //嘿嘿这里逻辑比较乱.. 返回吧.
}
- 上一篇:获取系统进程
- 下一篇:UNIX 下写的一个文件存取方式的小程序.




