关于C程序数据结构的问题

2024-12-04 22:49:29
推荐回答(1个)
回答1:

#include "stdafx.h"
#include

typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *pLinkList;

class LinkList
{
private:
pLinkList m_pList;
int m_listLength;
public:
LinkList();
~LinkList();
bool InitList ();
bool DestroyList ();
bool ClearList();
bool IsEmpty ();
int GetLength ();
bool GetNode(int position, LNode** node);
int LocateElem(int elem);
bool SetNodeData(int position, int newData);
bool GetNodeData(int position, int &data);
bool InsertNode(int beforeWhich, int data);
bool DeleteNode(int position);
};

LinkList::LinkList()
{
m_pList = NULL;
m_listLength = 0;

InitList();
}

LinkList::~LinkList()
{
if (!DestroyList())
{
DestroyList();
}
}

//初始化,分配一个头节点。
bool LinkList::InitList()
{
if (!(m_pList = new LNode))
{
return false;
}
m_pList->next = NULL;

return true;
}

//销毁链表。
bool LinkList::DestroyList()
{
if (!ClearList())
{
return false;
}
delete m_pList;

return true;
}

//判断链表是否为空。若为空,返回true,否则返回false。
bool LinkList::IsEmpty()
{
if (m_pList->next == NULL)
{
return true;
}
return false;
}

//返回链表的中当前节点数。
int LinkList::GetLength()
{
return m_listLength;
}

//将链表清空,释放当前所有节点。
bool LinkList::ClearList()
{
if (m_pList == NULL)
{
return false;
}

LNode *pTemp = NULL;
while (m_pList->next != NULL)
{
pTemp = m_pList->next;
m_pList->next = pTemp->next;
delete pTemp;
}
m_listLength = 0;

return true;
}

//将position指定的节点内的数据设置为newData。
//第一个有效节点的position为1。
bool LinkList::SetNodeData(int position, int newData)
{
LNode *pTemp = NULL;

if (!(GetNode(position, &pTemp)))
{
return false;
}

pTemp->data = newData;

return true;
}

//得到指定位置节点的数据。
//节点索引从1到listLength。
bool LinkList::GetNodeData(int position, int &data)
{
LNode *pTemp = NULL;

if (!(GetNode(position, &pTemp)))
{
return false;
}

data = pTemp->data;

return true;
}

//在链表中插入一个节点。
//插入的位置由beforeWhich指定,新节点插入在beforeWhich之前。
//beforeWhich的取值在1到ListLength+1之间。
bool LinkList::InsertNode(int beforeWhich, int data)
{
LNode *pTemp = NULL;

if (beforeWhich < 1 || beforeWhich > (m_listLength + 1))
{
return false;
}

if (!(GetNode(beforeWhich - 1, &pTemp)))
{
return false;
}

LNode *newNode = new LNode;
newNode->data = data;
newNode->next = pTemp->next;
pTemp->next = newNode;

m_listLength++;

return true;
}

//删除一个指定的节点。
//节点位置由position指定。
//positon的值从1到listLength。
//若链表为空或指定的节点不存在则返回false。
bool LinkList::DeleteNode(int position)
{
if (position < 1 || position > m_listLength)
{
return false;
}

LNode *pTemp = NULL;
if (!(GetNode(position - 1, &pTemp)))
{
return false;
}

LNode *pDel = NULL;
pDel = pTemp->next;
pTemp->next = pDel->next;
delete pDel;

m_listLength--;

return true;
}

//得到指定位置节点的指针。
bool LinkList::GetNode(int position, LNode **node)
{
LNode *pTemp = NULL;
int curPos = -1;

pTemp = m_pList;
while (pTemp != NULL)
{
curPos++;
if (curPos == position)
break;
pTemp = pTemp->next;
}

if (curPos != position)
{
return false;
}

*node = pTemp;

return true;
}

//定位与指定数据相等的数据节点。
//如果在当前链表中已经存在该数据则返回该数据节点的索引号。
//若不存在这样的节点则返回0。
//节点索引从0开始到listLength。
int LinkList::LocateElem(int elem)
{
LNode *pTemp = NULL;
int curIndex = 1;

pTemp = m_pList->next;
while ((pTemp != NULL) && (pTemp->data != elem))
{
pTemp = pTemp->next;
curIndex++;
}

if (pTemp == NULL)
{
return 0;
}

return curIndex;
}

int main()
{
LinkList E,F,G;
E.InsertNode(1,1);
E.InsertNode(2,2);
E.InsertNode(3,5);
E.InsertNode(4,7);
E.InsertNode(5,8);

F.InsertNode(1,2);
F.InsertNode(2,3);
F.InsertNode(3,8);
F.InsertNode(4,8);
F.InsertNode(5,9);

int k=1;
int ei,fj;
int E_len=E.GetLength();
int F_len=F.GetLength();
for(int i=1,j=1;i<=E_len&&j<=F_len;){
E.GetNodeData(i,ei);
F.GetNodeData(j,fj);
if(ei<=fj){
G.InsertNode(k++,ei);
i++;
}
else{
G.InsertNode(k++,fj);
j++;
}
}

if(i>E_len){
for(;j<=F_len;j++){
F.GetNodeData(j,fj);
G.InsertNode(i+j-1,fj);
}
}
else if(j>F_len){
for(;i<=E_len;i++){
E.GetNodeData(i,ei);
G.InsertNode(i+j-1,ei);
}
}

//int len=G.GetLength();
int data;
for (i=1; i <=G.GetLength(); i++)
{
G.GetNodeData(i, data);
cout << data << endl;
}
return 0;
}