对链表的操作代码

#include <iostream>
#include <malloc.h>

using namespace std;

typedef struct Node
{
int data;
struct Node * pNext;

}NODE , * PNODE;//NODE =struct Node,PNODE=struct Node *

/******************函数声明***********************/
PNODE create_list( );//创建链表

void travrse_list(PNODE pHead)//遍历链表


int getlength_list(PNODE pHead)//获取链表的长度


void delete_list(PNODE pHead,int val)//删除链表中某一特定元素val,比如:删除链表中数据为3的结点

void insert_list(PNODE pHead,int pos,int val)//在链表pos位置上插入val元素

void sort_list(PNODE pHead)//使用冒泡法进行排序

/******************************子函数************************************/
//创建链表
PNODE create_list( )
{
PNODE pHead,pTail;
int i=0;
int len;

pHead=(PNODE)malloc(sizeof(NODE));
if(pHead == NULL)
{
cout<<"创建链表头结点失败!"<<endl;
exit(-1);
}

pTail=pHead;
pTail->pNext=NULL;


cout<<"请输入链表的结点个数,len=";
cin>>len;

for(i=0;i<len;++i)
{
PNODE pNew=(PNODE)malloc(sizeof(NODE));

if(pNew == NULL)
{
cout<<"创建链表第"<<i+1<<"结点失败!"<<endl;
exit(-1);
}

cout<<"请输入第"<<i+1<<"结点的数据:";
cin>>pNew->data;

pTail->pNext=pNew;
pNew->pNext=NULL;
pTail=pNew;
}

return pHead;
}


//遍历链表
void travrse_list(PNODE pHead)
{
PNODE p=pHead->pNext;

if(p==NULL)
{
cout<<"所输入的链表为空,遍历链表失败!"<<endl;
return ;
}

while(p!=NULL)
{
cout<<p->data<<" ";
p=p->pNext;
}
cout<<endl;
}


//获取链表的长度
int getlength_list(PNODE pHead)
{
int len=0;

PNODE p=pHead->pNext;

if(p==NULL)
{
cout<<"所输入的链表为空,获取链表长度失败!"<<endl;
return 0;
}

while(p!=NULL)
{
++len;
p=p->pNext;
}

return len;

}

//删除链表中某一特定元素val,比如:删除链表中数据为3的结点
void delete_list(PNODE pHead,int val)
{
PNODE p1=pHead;
PNODE p2=pHead->pNext;
PNODE p3=NULL;//用来释放所删除结点

int cnt=0;
int len;

if(p2==NULL)
{
cout<<"所输入的链表为空,删除失败!"<<endl;
return ;
}

len=getlength_list(pHead);

while(p2!=NULL)
{
if(p2->data == val)
{
p3=p2;
p1->pNext=p2->pNext;
p2=p2->pNext;
free(p3);//释放所删除的结点的内存
p3=NULL;
}
else
{
++cnt;
p1=p2;
p2=p2->pNext;

}
}

if(cnt==len)
{
cout<<"链表没有您所需要删除的元素!"<<endl;
return ;
}

travrse_list(pHead);
}

//在链表pos位置上插入val元素
void insert_list(PNODE pHead,int pos,int val)
{
PNODE p1=pHead;
int i=0;
int len;

len=getlength_list(pHead);

if(pos<0||pos>len+1)
{
cout<<"无法在此位置插入元素!"<<endl;
return;
}


while(i<pos-1)
{
p1=p1->pNext;
++i;
}

PNODE p2=(PNODE)malloc(sizeof(NODE));

if(p2 == NULL)
{
cout<<"在插入元素时创建链表失败!"<<endl;
exit(-1);
}

p2->data=val;
p2->pNext=p1->pNext;
p1->pNext=p2;

return;
}

//使用冒泡法进行排序
void sort_list(PNODE pHead)
{
PNODE p1=pHead;
PNODE p2;
int i=0,j=0;
int len;
int t;

len=getlength_list(pHead);

for(i=0,p1=pHead->pNext;i<len-1;++i,p1=p1->pNext)
for(j=i+1,p2=p1->pNext;j<len;++j,p2=p2->pNext)
{
if(p1->data>p2->data)
{
t=p1->data;
p1->data=p2->data;
p2->data=t;
}
}


}
/******************************主函数************************************/
int main(void)
{
PNODE list1;
int cnt;

list1=create_list();
travrse_list(list1);
//delete_list(list1,2);
cnt=getlength_list(list1);
cout<<"链表的长度为:"<<cnt<<endl;
insert_list(list1,4,9);
travrse_list(list1);
sort_list(list1);
travrse_list(list1);
return 0;
}

 

posted on 2014-04-22 16:09  fx-sg  阅读(216)  评论(0编辑  收藏  举报

导航