C++ 用结构体封装链表
结构体的语法形式
struct 结构体名{
//成员变量
//成员函数
};
示例
typedef struct test
{
void setval(int a) //成员函数
{
val = a;
}
int getval()
{
return val;
}
int val; //成员变量
}st_t;
int main()
{
st_t stru;
stru.val = 88;
stru.setval(66); //结构体变量访问成员函数
cout << stru.getval() << endl;
return 0;
}
在C++里用结构体封装链表
::是作用域访问符,是起限定作用的
完整示例代码
#include <iostream>
#include <stdio.h>
using namespace std;
typedef int link_data_t;
typedef struct Linklist{
link_data_t data; //数据域
struct Linklist *next; //指针域
}Link_node,*Link_pnode;
typedef struct Linklist_hanshu
{
Link_pnode create_link();
int empty_link(Link_pnode L); //判空
int getlen_link(Link_pnode L); //求长度
int select_link(Link_pnode L,int pos); //按位置查找
int print_link(Link_pnode L); //遍历链表并打印
int insert_link(Link_pnode L,int pos,link_data_t data); //按位置插入
int delete_link(Link_pnode L,int pos); //按位置删除
}Link_math;
Link_pnode Link_math::create_link()
{
Link_pnode L = (Link_pnode)malloc(sizeof(Link_node));
if(L == NULL)
{
cout << "create fail" << endl;
return NULL;
}
L->next = NULL;
return L;
}
int Link_math::empty_link(Link_pnode L)
{
if(L == NULL)
{
cout << "L is NULL" << endl;
return -1;
}
else if(L->next == NULL)
return 0;
else
return 1;
}
int Link_math::getlen_link(Link_pnode L)
{
int len = 0;
if(-1 == (empty_link(L)))
{
cout << "L is NULL" << endl;
return -1;
}
else if(0 == (empty_link(L)))
{
return 0;
}
else
{
while(L->next)
{
L = L->next;
len++;
}
return len;
}
}
int Link_math::select_link(Link_pnode L,int pos)
{
if(-1 == (empty_link(L)))
{
cout << "L is NULL" << endl;
return -1;
}
else if(pos < 0 ||pos > getlen_link(L))
{
cout << "wrong position" << endl;
return -1;
}
else
{
for(int i = pos;i > 0;i--)
{
L = L->next;
}
return L->data;
}
}
int Link_math::print_link(Link_pnode L)
{
if(1 != empty_link(L))
{
cout << "no data" << endl;
return -1;
}
else
{
L = L->next;
while(L)
{
printf("data=%d-> ",L->data);
L = L->next;
}
cout << '\n' << endl;
}
return 0;
}
int Link_math::insert_link(Link_pnode L,int pos,link_data_t data)
{
if(-1 == empty_link(L))
return -1;
Link_pnode p = create_link();
p->data = data;
p->next = NULL;
int i;
for(i = pos-1;i > 0;i--)
{
L = L->next;
}
p->next = L->next;
L->next = p;
return 0;
}
int Link_math::delete_link(Link_pnode L,int pos)
{
if(-1 == empty_link(L))
return -1;
if(pos < 0 || pos > getlen_link(L))
return -1;
Link_pnode p = create_link();
int i;
for(i = pos-1;i > 0;i--)
{
L = L->next;
}
p = L->next;
p->data = L->next->data;
L->next = p->next;
free(p);
return p->data;
}
int main()
{
Link_math obj;
Link_pnode L = obj.create_link();
obj.insert_link(L,1,12);
obj.insert_link(L,2,3);
obj.insert_link(L,3,33);
obj.insert_link(L,4,61);
obj.print_link(L);
obj.delete_link(L,2);
obj.print_link(L);
}