数据结构,又见数据结构!!花了整晚时间搞懂了,并由非形式语言转成了C++(DEV C++ 4.9.9.0完成编译通过),可这些结构以后会在哪些方面应用得

mylovelypig 2004-12-07 11:13:59
/******************************************************************************

内容章节: 第2章 线性表

章节信息: 2.3-2.4(Page21-32)
逻辑结构: 线性结构
数据结构: 线性表
存储结构: 链式存储结构(单链表)
存储实现: 线性结构的链式存储实现
程序功能: 基于线性表上的基本运算实现
程序文件: 2_2.cpp

函数描述:
<1>.基本运算:
序号 函数名称 功能描述
01. Initiate() 初始化运算;
02. Length() 求表长运算;
03 Find() 查找运算;
04. Locate() 定位运算;
05. Insert() 插入运算;
06. Delete() 删除运算;
07. Update() 更新运算;

<2>.其它函数:
序号 函数名称 功能描述
08. CreateLklist1() 建表运算
09. Append() 添加运算
10. Purge() 删除表中重复结点
11. TestData() 批量加入测试数据
12. GetAll() 显示表中所有数据
13. DisplayControl() 显示具体操作选项
14. TableControl() 执行所选择的操作
其它说明:
1.链表分类:单链表、 循环链表(单向循环链表)、 双链表(双向循环链表).
同时2.7节还介绍了串, 串的顺序存储(顺序串), 串的链式存储(链串) ,
但本程序只是仅仅基于单链表的基本运算实现.

程序作者: WaitFor
建立日期: 2004-12-06
联系信息: szstir@126.com

历史记录:
1.2004-12-07 完成;


******************************************************************************/

#include <iostream>

using namespace std;

typedef int DataType; /* 可根据具体需要将int换成其它数据类型 */
typedef struct node *Pointer;
struct node
{
DataType Data;
Pointer Next;
};

typedef Pointer PHead; /* PHead为头指针声明变量时使用 */

/* 初始化基本运算,建立一个空链表,并让头指针指向头结点. */
PHead Initiate( )
{
/* 声明头指针变量, 该变量将指向下面声明的头结点 */
PHead PtrHead;

/* 声明头结点, 头结点是为了便于基本运算的实现而引入的,在本书中
与首结点是不同的概念.结点分为:头结点、首结点、表结点、尾结点.*/
Pointer HeadNode;

HeadNode = new( node ); /* 生成头结点 */
HeadNode->Next = NULL; /* 设置NULL,以示没有后继结点 */

PtrHead = HeadNode; /* 使头指针指向头结点 */
return( PtrHead );
}

int Length( PHead TableHead ) /* 求表长运算 */
{
int PointCount = 0; /* 定义结点个数的计数器 */
Pointer WorkPtr; /* 定义工作指针 */

WorkPtr = TableHead; /* 让工作指针指向链表的表头 */

while (WorkPtr->Next != NULL) /* 还不到尾结点则继续计数 */
{
PointCount++;
WorkPtr = WorkPtr->Next;
}

return( PointCount );
}

/* 查找运算, 在链表中查找第i个结点, 如果找到则返回该结点的指针; 否则返回NULL */
Pointer Find( PHead TableHead, int i )
{
Pointer WorkPtr;
int j;

WorkPtr = TableHead;
j = 0;

/* 当未达到链表结尾且还没有找到第i个结点时继续查找 */
while ( (WorkPtr->Next != NULL) && ( j < i ) )
{
j++;
WorkPtr = WorkPtr->Next;
}

if (i == j) /* 当(i == j) 时说明已经找到该结点 */
{
return( WorkPtr );
}
else
{
return( NULL );
}
}

/* 定位运算, 查找x在链表中的第1个位置 */
int Locate( PHead TableHead, DataType x )
{
Pointer WorkPtr;
int i = 0;

WorkPtr = TableHead;

/* 当未到达链表结点的结尾且还没有找到该结点时继续查找 */
while ( (WorkPtr->Next != NULL) && (WorkPtr->Data != x) )
{
i++;
WorkPtr = WorkPtr->Next;
}

if (WorkPtr->Data == x)
{
return( i );
}
else
{
return( 0 );
}
}

/* 删除运算, 删除链表中的第i个结点 */
bool Delete( PHead TableHead, int i )
{
Pointer Prior, Current;

Prior = Find( TableHead, (i-1) ); /* 先查找待删结点的直接前趋 */

/* 若直接前趋结点存在且待删结点存在*/
if ( (Prior != NULL) && (Prior->Next != NULL) )
{
Current = Prior->Next; /* Current指向待删结点 */
Prior->Next = Current->Next; /* 摘除待删结点 */
delete ( Current ); /* 释放已摘除结点 */
return( true );
}
else
{
cout << "第 " << i << " 个结点不存在!" << endl;
return( false );
}
}

/* 插入运算, 在表中的第Pos个位置插入一个数据为x的结点 */
bool Insert( PHead TableHead, DataType x, int Pos )
{
Pointer Prior, InserNode;

Prior = Find( TableHead, (Pos-1) ); /* 先找待插入结点的前一个结点(Pos-1) */
if ( Prior == NULL )
{
cout << "不存在第 " << Pos << " 个位置!" << endl;
return( false );
}
else
{
InserNode = new( node );
InserNode->Data = x;
InserNode->Next = Prior->Next;
Prior->Next = InserNode;
return( true );
}
}

/* 更新运算, 用x的值更新表中第Pos个结点的值 */
bool Update( PHead TableHead, DataType x, int Pos)
{
Pointer WorkPtr;

WorkPtr = TableHead;
if ( WorkPtr->Next == NULL )
{
cout << "空表!" << endl;
return( false );
}

WorkPtr = Find( TableHead, Pos );

if ( WorkPtr != NULL )
{
WorkPtr->Data = x;
return( true );
}
else
{
cout << "不存在第 " << Pos << " 个结点!" << endl;
return( false );
}
}

/* 建新表, 根据输入数据来建表 */
PHead CreateLklist1( )
{
int i;
DataType x;
PHead TableHead;

TableHead = Initiate( );
i = 1; /* 置插入位置初值 */
cout << "请输入要插入的数据:";
cin >> x;

while (x != '$') /* 如果输入的不是结束标志'$'则继续插入 */
{
Insert( TableHead, x, i );/* 将输入插入到表尾 */
i++;
cout << "请输入要插入的数据:";
cin >> x;
}
return( TableHead );
}
...全文
232 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangk 2004-12-10
  • 打赏
  • 举报
回复
up
mylovelypig 2004-12-10
  • 打赏
  • 举报
回复
up
Kenny_Glacier 2004-12-08
  • 打赏
  • 举报
回复
应该有用吧,哈


〉〉wwxsoft(婉儿) ( ) 信誉:100 2004-12-08 10:09:00 得分: 0

??
你是群上的那个婉儿吗??
wujian53 2004-12-08
  • 打赏
  • 举报
回复
yun, 你用C++写程序, 用空去看看STL源码
dudu妈 2004-12-08
  • 打赏
  • 举报
回复
hah 我不是高手,请高手回答
xuelong_zl 2004-12-08
  • 打赏
  • 举报
回复
我个人认为,所有的数据结构都只是解决问题的一种方面或手段,最重要的是学会它的思想和实现的算法.用处还是有很多的,比如人员管理中,可以把一个人的基本信息看做一个结构,然后就可以对每个人进行上面的操作.不过在现实工作中,更常用的是你自己创建数据结构.
Squall1009 2004-12-08
  • 打赏
  • 举报
回复
list可以用于经常需要在两个元素之间或者在最前面插入元素或者删除元素的地方
JustForWater 2004-12-08
  • 打赏
  • 举报
回复
面试的时候考。

本身也很有用。以后你就知道了。
AlphaCN_NET 2004-12-08
  • 打赏
  • 举报
回复
嘿嘿~ 再LINUX中相当多的控制都是使用链表的~
比如说等待队列, 内存管理也是使用链表的
当你学了操作系统之后就会发现链表在系统中是无处不在阿

嘿嘿,
goodluckyxl 2004-12-08
  • 打赏
  • 举报
回复
基本联表是肯定要用的
而且很常用 没错
但是 自己写的很难达到工业化标准
所以就如上面说的练手不为过 你知道怎么用极其原理
对于这种逻辑组织的思想你就有了
至于使用联表的STL库中实现的相当好
偶自己也写过 就是为了练手
^_^
mylovelypig 2004-12-08
  • 打赏
  • 举报
回复
有相当程序员生涯经历的过来说说,,,
这些结构具体会应用到什么地方去呢?
数据库??可是我学了,也感觉不出那些结构要实现,
因为这些都由数据库开发商完成了!
mylovelypig 2004-12-07
  • 打赏
  • 举报
回复
楼上的,链表很常用?但是你们一般用在什么地方呀?
就是书中所说的顺序串与链串这两个吗?<不是已经有现成的数组了吗?>
  • 打赏
  • 举报
回复
链表这些还是很常用的吧?
avalonBBS 2004-12-07
  • 打赏
  • 举报
回复
就当练手吧,学了不坏 :)
mylovelypig 2004-12-07
  • 打赏
  • 举报
回复

void TableControll( PHead TableHead )
{
char SelChar;
int Pos;
DataType InData;
Pointer WorkPtr;

TableHead = Initiate(); /* 初始化链表 */

do
{
do
{
DisplayControl();
SelChar = getchar();
if ((SelChar < '0') || (SelChar > '9'))
{
cout << "\a"; /* 输入错误响铃 */
}
}
while ((SelChar < '0') || (SelChar > '9'));

system("cls");

switch ( SelChar )
{
case '1':
TestData( TableHead );
cout << "批量加入数据巳完成 ." << endl
<< "返回后请选第9项查询." << endl;
break;

case '2':
cout << "目前表长是:" << Length( TableHead ) << endl;
break;

case '3':
cout << "请输入要显示数据的位置:";
cin >> Pos;
WorkPtr = Find( TableHead, Pos );
if ( WorkPtr != NULL )
{
cout << "第 " << Pos << " 个位置的数据是:"
<< WorkPtr->Data << endl;
}
else
{
cout << "不存在第 " << Pos << " 个位置!" << endl;
}
break;

case '4':
cout << "请输入数据,搜索其在表中第一次出现的位置:";
cin >> InData;
Pos = Locate( TableHead, InData );
if ( Pos > 0 )
{
cout << InData << " 在表中第一次出现的位置是:"
<< Pos << endl;
}
else
{
cout << InData << " 不在链表中!" << endl;
}
break;

case '5':
cout << "请输入要插入数据的位置:";
cin >> Pos;
cout << "请输入要插入的数据:";
cin >> InData;
if ( Insert( TableHead, InData, Pos ) )
{
cout << "插入数据成功." << endl;
}
else
{
cout << "插入数据失败!" << endl;
}
break;

case '6':
cout << "添加的数据将置于表尾." << endl;
cout << "请输入要添加的数据:";
cin >> InData;
Append( TableHead, InData );
break;

case '7':
cout << "请输入要删除数据的位置:";
cin >> Pos;
if ( Delete( TableHead, Pos ) )
{
cout << "删除数据成功." << endl;
}
else
{
cout << "删除数据失败!" << endl;
}
break;

case '8':
cout << "请输入要更新数据的位置:";
cin >> Pos;
cout << "请输入要更新的数据:";
cin >> InData;
if ( Update( TableHead, InData, Pos ) )
{
cout << "更新数据成功." << endl;
}
else
{
cout << "更新数据失败!" << endl;
}
break;

case '9':
GetAll( TableHead );
break;

default :
break;
} /* switch 结束 */

rewind( stdin ); /* 清除键盘缓冲区 */

if (SelChar != '0')
{
cout << "操作完成,按任意键返回." << endl;
getchar();
}

}
while ( SelChar != '0' ); /* 第一个do结束 */
}

int main()
{
PHead LinkTable;

TableControll( LinkTable );

return ( 0 );
}

mylovelypig 2004-12-07
  • 打赏
  • 举报
回复

/************************************************************
在链表的结尾添加结点.
************************************************************/
void Append( PHead TableHead, DataType x )
{
PHead TableRear;/* 定义表尾指针 */
Pointer InsertNode;
int TableLen;

TableLen = Length( TableHead );
TableRear = Find( TableHead, TableLen ); /* 尾指针置初值 */

InsertNode = new( node ); /* 生成新结点 */
InsertNode->Data = x;
TableRear->Next = InsertNode; /* 将刚生成的新结点添加到表尾 */
TableRear = InsertNode;

TableRear->Next = NULL; /* 尾结点置空指针为结束标志 */
}

/* 清除表中多余的重复结点 */
void Purge( PHead TableHead )
{
Pointer Current, Work, WillDel;

Current = TableHead; /* 指向头结点 */
if ( Current->Next ==NULL )
{
cout << "空表!" << endl;
return; /* 空表则返回 */
}

/* 当前检查的结点不是尾结点时,寻找它的重复结点删除 */
while ( Current->Next != NULL )
{
Work = Current; /* 工作指针指向当前结点 */
while ( Work->Next != NULL )
{ /* 当Work的后继结点存在,将其的数据域与当前结点Current的数据域作比较 */
if ( Work->Next->Data == Current->Data )
{
WillDel = Work->Next; /* WillDel指向待删结点 */
Work->Next = Work->Next->Next;/* 摘除结点 */
//Work->Next = WillDel->Next;等价上一语句
delete( WillDel ); /* 释放该结点所占用的空间 */
}
else
{
Work = Work->Next; /* 否则让Work指向下一个结点 */
} /* end of if */

} /* end of while ( Work->Next != NULL ) */

Current = Current->Next; /* 更新当前检查结点 */

} /* end of while ( Current->Next != NULL ) */
}


/* 加入测试数据 */
void TestData(PHead TableHead)
{
DataType x;
PHead TableRear;/* 定义表尾指针 */
Pointer InsertNode;
int i, TableLen;

TableLen = Length( TableHead );
TableRear = Find( TableHead, TableLen ); /* 尾指针置初值 */

for (i=1; i <= 10; i++)
{
x = i * 10;
InsertNode = new( node );
InsertNode->Data = x;
TableRear->Next = InsertNode;
TableRear = InsertNode;
}

TableRear->Next = NULL;
}

/* 显示表中所有的数据 */
void GetAll( PHead TableHead )
{
Pointer WorkPtr;
int Pos = 0;

WorkPtr = TableHead;
if ( WorkPtr->Next == NULL )
{
cout << "空表!" << endl;
return;
}

while ( WorkPtr->Next != NULL )
{
Pos++;
cout << "第 " << Pos
<< " 位置的数据是:"
<< WorkPtr->Next->Data << endl;

WorkPtr = WorkPtr->Next;
}
}

/* 显示控制 */
void DisplayControl( )
{
system( "cls" );
cout << endl;
cout << "**********************单链表的存储实现**********************" << endl;
cout << "*==================* 1.加入数据 " << "*==================*" << endl;
cout << "*==================* 2.显示长度 " << "*==================*" << endl;
cout << "*==================* 3.显示数据 " << "*==================*" << endl;
cout << "*==================* 4.数据位置 " << "*==================*" << endl;
cout << "*==================* 5.插入数据 " << "*==================*" << endl;
cout << "*==================* 6.添加数据 " << "*==================*" << endl;
cout << "*==================* 7.删除数据 " << "*==================*" << endl;
cout << "*==================* 8.更新数据 " << "*==================*" << endl;
cout << "*==================* 9.显示全部 " << "*==================*" << endl;
cout << "*==================* 0.退出程序 " << "*==================*" << endl;
cout << "************************************************************" << endl;
cout << " 请选择(0-9):";
}

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧