test C++实现一个链表
2013-01-17 13:17
381 查看
#include<iostream>
#include<malloc.h>
#include<cstring>
#define INPUT_LEN 100
using namespace std;
//template<class T>
class student{
public:
int sid;
string name;
};
/*struct node start*/
class node {
public:
node(){}
node(void* dt, short len, node* nt):data(dt),dataLen(len),next(nt){}
void getData(void** dt,short* len){
*dt = data;
*len = dataLen;
}
void getNext(node* nt){
nt = next;
}
void* data;
short dataLen;
node* next;
};
/*struct node end*/
/******************class list start**********************************/
class list{
public:
list(){listHeader = NULL;}
int add(void* data, short len);
int add(void* data, short len,int index);
int deleteByIndex(int index);
node* getByIndex(int index);
int getSize();
bool isEmpty();
void setEmpty();
private:
node* listHeader;
};
/******************class list end***********************************/
/******************class list functions start*********************************************/
//getSize
int list::getSize(){
int size = 0;
node *p = 0;
p = listHeader;
while(p){
p = p->next;
size++;
}
return size;
}
//isEmpty
bool list::isEmpty(){
if(NULL == listHeader){
return true;
}
else{
return false;
}
}
//setEmpty
void list::setEmpty(){
for( int i = getSize() ; i > 0 ; --i){
deleteByIndex(i-1);
}
listHeader = NULL;
}
/*add node to tail*/
int list::add( void* data, short len ){
node *p = NULL;
int ret = 1;
node *nn = new node(data, len, NULL);
if(isEmpty()){
listHeader = nn;
return ret;
}
p = listHeader;
while( NULL != p->next ){
p = p->next;
}
p->next = nn;
p = NULL;
nn = NULL;
return ret;
}
//add node by index
int list::add(void* data, short len, int index){
node *p = listHeader;
node *tempNode;
int ret = 0;
int i = 0;
if(isEmpty() || index > getSize()) {
cout<<"index out of list size!"<<endl;
return -1;
}
node *nn = new node(data, len, NULL);
if(0 == index){
tempNode = listHeader;
listHeader = nn;
listHeader->next = tempNode;
}
else{
while(p && ++i < index){
p = p->next;
}
if(i == index){
tempNode = p->next;
p->next = nn;
p->next->next = tempNode;
ret = 1;
}
}
p = NULL;
nn = NULL;
tempNode = NULL;
return ret;
}
//get data by index
node* list::getByIndex(int index){
int i = 0;
node *p = listHeader;
node *ret = NULL;
if(isEmpty() || index >= getSize()) {
cout<<"index out of list size!"<<endl;
return ret;
}
while(NULL != p && i <= index){
if(i == index){
ret = p;
break;
}
p = p->next;
i++;
}
p = NULL;
return ret;
}
//delete by index
int list::deleteByIndex(int index){
int ret = -1;
int i = 0;
node *tempNode = NULL;
node *p = listHeader;
if(isEmpty() || index >= getSize()){
cout<<"index out of list size!"<<endl;
return -1;
}
if(1 == getSize()){
tempNode = listHeader;
listHeader = NULL;
}
else{
while(p->next && ++i < index){
p = p->next;
}
if(p->next){
tempNode = p->next;
p->next = p->next->next;
ret = 1;
}
}
if(NULL != tempNode){
free(tempNode->data);
free(tempNode);
tempNode = NULL;
}
p=NULL;
return ret;
}
/****************************class list functions end*********************************************/
//print list data
void printList(list lst){
char ch[INPUT_LEN]={0};
node *p = NULL;
for(int i = 0; i < lst.getSize(); i++){
p = lst.getByIndex(i);
memset(ch, 0, INPUT_LEN);
memcpy((char*)ch, (char*)p->data,p->dataLen);
cout<<ch<<endl;
}
}
//delete list
void deleteList(list* lst){
lst->setEmpty();
}
void run1(){
char* data = NULL;
short len = 0;
list list1;
char ch[INPUT_LEN] = {0};
int i = 0;
cout<<"Create list,input data:"<<endl;
while(i < 5)
{
memset(ch,0,INPUT_LEN);
scanf("%s", ch);
len = strlen(ch);
if(0 < len){
data = (char*)malloc(len);
memset(data,0,len);
memcpy(data, &ch, len);
if ( 4 == i ){
list1.add(data, len, i);
}
else{
list1.add(data, len);
}
}
else{
break;
}
i++;
}
printList(list1);
deleteList(&list1);
cout<<"after delete!"<<endl;
printList(list1);
}
void run2(){
list list1;
node* nd = NULL;
student* stu1;
student* stu2;
short len = sizeof(student);
for (int i = 0; i < 5; i++){
stu1 = new student();
stu1->sid = i;
stu1->name = "bandaotilan";
list1.add(stu1,len);
}
for (int i = 0; i < list1.getSize(); i++){
nd = list1.getByIndex(i);
stu2 = (student*)nd->data;
cout<<stu2->sid<<endl;
cout<<stu2->name<<endl;
}
}
//main function
int main(){
//run1();
run2();
}
#include<malloc.h>
#include<cstring>
#define INPUT_LEN 100
using namespace std;
//template<class T>
class student{
public:
int sid;
string name;
};
/*struct node start*/
class node {
public:
node(){}
node(void* dt, short len, node* nt):data(dt),dataLen(len),next(nt){}
void getData(void** dt,short* len){
*dt = data;
*len = dataLen;
}
void getNext(node* nt){
nt = next;
}
void* data;
short dataLen;
node* next;
};
/*struct node end*/
/******************class list start**********************************/
class list{
public:
list(){listHeader = NULL;}
int add(void* data, short len);
int add(void* data, short len,int index);
int deleteByIndex(int index);
node* getByIndex(int index);
int getSize();
bool isEmpty();
void setEmpty();
private:
node* listHeader;
};
/******************class list end***********************************/
/******************class list functions start*********************************************/
//getSize
int list::getSize(){
int size = 0;
node *p = 0;
p = listHeader;
while(p){
p = p->next;
size++;
}
return size;
}
//isEmpty
bool list::isEmpty(){
if(NULL == listHeader){
return true;
}
else{
return false;
}
}
//setEmpty
void list::setEmpty(){
for( int i = getSize() ; i > 0 ; --i){
deleteByIndex(i-1);
}
listHeader = NULL;
}
/*add node to tail*/
int list::add( void* data, short len ){
node *p = NULL;
int ret = 1;
node *nn = new node(data, len, NULL);
if(isEmpty()){
listHeader = nn;
return ret;
}
p = listHeader;
while( NULL != p->next ){
p = p->next;
}
p->next = nn;
p = NULL;
nn = NULL;
return ret;
}
//add node by index
int list::add(void* data, short len, int index){
node *p = listHeader;
node *tempNode;
int ret = 0;
int i = 0;
if(isEmpty() || index > getSize()) {
cout<<"index out of list size!"<<endl;
return -1;
}
node *nn = new node(data, len, NULL);
if(0 == index){
tempNode = listHeader;
listHeader = nn;
listHeader->next = tempNode;
}
else{
while(p && ++i < index){
p = p->next;
}
if(i == index){
tempNode = p->next;
p->next = nn;
p->next->next = tempNode;
ret = 1;
}
}
p = NULL;
nn = NULL;
tempNode = NULL;
return ret;
}
//get data by index
node* list::getByIndex(int index){
int i = 0;
node *p = listHeader;
node *ret = NULL;
if(isEmpty() || index >= getSize()) {
cout<<"index out of list size!"<<endl;
return ret;
}
while(NULL != p && i <= index){
if(i == index){
ret = p;
break;
}
p = p->next;
i++;
}
p = NULL;
return ret;
}
//delete by index
int list::deleteByIndex(int index){
int ret = -1;
int i = 0;
node *tempNode = NULL;
node *p = listHeader;
if(isEmpty() || index >= getSize()){
cout<<"index out of list size!"<<endl;
return -1;
}
if(1 == getSize()){
tempNode = listHeader;
listHeader = NULL;
}
else{
while(p->next && ++i < index){
p = p->next;
}
if(p->next){
tempNode = p->next;
p->next = p->next->next;
ret = 1;
}
}
if(NULL != tempNode){
free(tempNode->data);
free(tempNode);
tempNode = NULL;
}
p=NULL;
return ret;
}
/****************************class list functions end*********************************************/
//print list data
void printList(list lst){
char ch[INPUT_LEN]={0};
node *p = NULL;
for(int i = 0; i < lst.getSize(); i++){
p = lst.getByIndex(i);
memset(ch, 0, INPUT_LEN);
memcpy((char*)ch, (char*)p->data,p->dataLen);
cout<<ch<<endl;
}
}
//delete list
void deleteList(list* lst){
lst->setEmpty();
}
void run1(){
char* data = NULL;
short len = 0;
list list1;
char ch[INPUT_LEN] = {0};
int i = 0;
cout<<"Create list,input data:"<<endl;
while(i < 5)
{
memset(ch,0,INPUT_LEN);
scanf("%s", ch);
len = strlen(ch);
if(0 < len){
data = (char*)malloc(len);
memset(data,0,len);
memcpy(data, &ch, len);
if ( 4 == i ){
list1.add(data, len, i);
}
else{
list1.add(data, len);
}
}
else{
break;
}
i++;
}
printList(list1);
deleteList(&list1);
cout<<"after delete!"<<endl;
printList(list1);
}
void run2(){
list list1;
node* nd = NULL;
student* stu1;
student* stu2;
short len = sizeof(student);
for (int i = 0; i < 5; i++){
stu1 = new student();
stu1->sid = i;
stu1->name = "bandaotilan";
list1.add(stu1,len);
}
for (int i = 0; i < list1.getSize(); i++){
nd = list1.getByIndex(i);
stu2 = (student*)nd->data;
cout<<stu2->sid<<endl;
cout<<stu2->name<<endl;
}
}
//main function
int main(){
//run1();
run2();
}
相关文章推荐
- [面试] - 在单链表末尾添加一个节点 C++ 实现
- 实现一个简单的c++ list容器(含sort排序 链表归并算法实现)
- c++实现两有序链表合并成一个新链表
- C++利用链表模板类实现一个简易队列
- C++ 自己实现的一个testSuite 框架
- 一个简单链表的C++实现
- 用一段代码实现一个链表倒序(C++实现)
- C++ 递归实现反向打印一个链表(引入wrapper function的概念)
- 一个简单的C++的链表实现(使用类模板)
- 一个c++实现的链表,如下:
- C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)
- C++中实现一个简单的单向链表
- 一个简单链表的C++实现(二)
- [面试] - 在单链表末尾添加一个节点 C++ 实现
- c/c++实现将cef的一堆dll单独放在一个文件夹,与程序exe目录区分开
- 用c写的一个栈的链表实现
- C++二叉树的链表实现
- C++面试题(二)——自己实现一个String类
- C++实现的链表队列
- C++中的链表节点用模板类和用普通类来实现的区别