1. 程式人生 > >分別用C和C++實現了連結串列結構

分別用C和C++實現了連結串列結構

C實現:這裡寫程式碼片

LINKED_LIST.h

typedef struct S_NODE
{
float data;
struct S_NODE *link;

}Node;

//建立連結串列
Node* Create()
{
Node *root,*tail,*pnew;
float data;
int i;
root=(Node*)malloc(sizeof(Node));
if(root==NULL)
{printf(“頭結點建立失敗\n”);return NULL;}
root->link=NULL;
tail=root;

for(i=0;i<10;++i)
{

    data=i;
    pnew=(Node*)malloc(sizeof(Node));
    pnew->data=data;
    pnew->link=NULL;
    tail->link=pnew;
    tail=pnew;

}
return root;

}
//向頭指標為head的連結串列 的loc位置插入資料data
void Insert(Node* root,int loc,float data)
{
Node *pnew,*p=root;
int i=1;
pnew=(Node*)malloc(sizeof(Node));
pnew->data=data;

while(i++<loc)
{
    p=p->link;
    if (p->link==NULL&&i<loc)
    {printf("插入位置錯誤\n");return ;}

}
//這時p指向要插入的結點
pnew->link=p->link;
//p->link=NULL; 這條語句可省略 不用先將p->link賦NULL 可直接改變p->link的值
p->link=pnew;

}
//刪除連結串列第DelIdx個結點
void Delete(Node* root,int DelIdx)
{
Node *p=root ,*previous=NULL;
int i=0;
while(i< DelIdx)
{
if(i==DelIdx-1)
previous=p; //找到要刪除結點的前一個結點
p=p->link;
if(p==NULL)//判斷是否刪除最後的無用資料
{printf(“刪除位置錯誤\n”);return;}
++i;
}

previous->link=p->link;//跳過刪除結點
//這是p所指向的結點就是要刪除的結點
free(p);

}
//顯示連結串列所有結點資料
void Display(Node* root)
{
Node *p;
p=root->link;
while(1)
{
printf(“%f\t”,p->data);
if(p->link==NULL)//最後一個結點
break;
p=p->link;
}
}
//釋放連結串列記憶體
void Free(Node *root)
{
Node *p,*q;
p=root;
do
{
q=p->link;
p->link=q->link;
free(q);
}
while(p->link!=NULL);

free(p);

}
//在連結串列中查詢資料data 找到則返回序號 找不到返回0
int find(Node *root,float data)
{
Node *p;
int idx=1;
p=root->link;

while(p!=NULL)
{
    if(p->data==data)
    return idx;
    p=p->link;
    ++idx;
}
return 0;//表示沒找到data

}
//返回連結串列的長度
int length(Node *root)
{
Node *p;
int len=0;
p=root->link;
while(p!=NULL)
{++len;p=p->link;}
return len;
}

LINKED_LIST.c

include < stdio.h>

include< stdlib.h>

include”LINKED_LIST.h”

void main()
{
Node *root;
int data=5;
root=Create();//構造連結串列
Insert(root,9,23);//將資料23插入到第8個結點位置
Delete(root,8);//刪除連結串列中的第8個數據
Display(root);//顯示此時連結串列的資料
printf(“連結串列長度為:%d\n”,length(root));
printf(“%d在連結串列的第%d個位置\n”,data,find(root,data));

Free(root);//釋放連結串列記憶體

}

C++ 實現這裡寫程式碼片

**

LINKED_LIST.c

**

include< iostream >

include”LINKED_LIST.h”

using namespace std;
void main()
{
List Mylist;
float i;
int j=1;
float data=5;
int len,dedata=8;
cout<<”構造後連結串列的長度為”<< Mylist.length()<< endl;

for(i=0;i<10;++i)
{
    Mylist.Insert(j,i);
    ++j;
}
cout<<"構造的連結串列為:"<<endl;
Mylist.Display();
Mylist.Delete(dedata);
cout<<"輸出一個結點後的連結串列為:"<<endl;
Mylist.Display();
cout<<data<<"在連結串列中的位置為:"<<Mylist.Find(data)<<endl;

}
**

LINKED_LIST.h

**

include < stdlib.h >

define space ” “

//結點結構體宣告
typedef struct S_Node
{
float data;
struct S_Node *link;

}Node;

// 連結串列類宣告
class List
{
private:
//public:
Node *root;
//Node *tail; tatil其實沒有 哪個結點的link為空 哪個結點就是tail 結點
public:
List();
~List();
int& length();
void Insert(int &loc,float &data);//傳引用 為了提高效率
void Display();
void Delete(int &idx);
int& Find(float &data);

};

/*******連結串列類函式定義***********/
List::List()
{
std::cout<< “已經入建構函式…”<< std::endl;
this->root=new Node();
root->link=NULL;
}
int &List::length()
{
int len=0;
Node *p=this->root->link;
while(p!=NULL)
{++len;p=p->link;}
return len;
}
void List::Insert(int &loc,float &data)
{
Node *pnew;
Node *p=this->root;
int i=1;
pnew=new Node();
pnew->data=data;

while(i++<loc)
{
    p=p->link;
    if (p->link==NULL&&i<loc)
    {printf("插入位置錯誤\n");return ;}

}
//這時p指向要插入的結點
pnew->link=p->link;
p->link=pnew;

}
void List::Display()
{
std::cout<< “連結串列為:”<< std::endl;
Node *p=this->root->link;
while(p!=NULL)
{std::cout<data<< space;p=p->link;}
std::cout<< std::endl;
}

void List::Delete(int &DelIdx )
{
Node *p=this->root ,*previous=NULL;
int i=0;
while(i< DelIdx)
{
if(i==DelIdx-1)
previous=p; //找到要刪除結點的前一個結點
p=p->link;
if(p==NULL)//判斷是否刪除最後的無用資料
{printf(“刪除位置錯誤\n”);return;}

    ++i;
}

previous->link=p->link;//跳過刪除結點
//這是p所指向的結點就是要刪除的結點
delete(p);

}

int &List::Find(float &data)
{
Node *p;
int idx=1;
p=this->root->link;

while(p!=NULL)
{
    if(p->data==data)
    return idx;
    p=p->link;
    ++idx;
}
std::cout<<"查詢的資料"<<data<<"不在連結串列中"<<std::endl;
exit(1);

}
List::~List()
{
Node *p,*q;
std::cout<<”已進入解構函式…”<< std::endl;
p=this->root;
do
{
q=p->link;
p->link=q->link;
delete(q);
}
while(p->link!=NULL);

delete(p);

}