单链表:
- 结构描述
- 初始化
- 遍历
- 插入/删除
- 查找
- 排序(冒泡)
下面是具体的实现:
1.结构描述:
typedef struct Node
{
int data;//数据域
struct Node *pNext;//指针域
}NODE,*PNODE;
2.初始化:
PNODE creat_list()
{
int len;//有效节点的个数。
int i;
int val;//临时存放用户输入节点的值。
PNODE pHead=(PNODE)malloc(sizeof(NODE));
if(pHead==NULL)
{
cout<<"分配失败,程序终止!"<<endl;
exit(-1);//exit(1);
}
PNODE pTail=pHead;
pTail->pNext =NULL;
cout<<"请输入您需要生成的链表节点的个数:len=";
cin>>len;
for(i=0;i<len;i++)
{
cout<<"请输入第"<<i+1<<"个节点的值:";
cin>>val;
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(pNew==NULL)
{
cout<<"分配失败,程序终止!"<<endl;
exit(-1);//exit(1);
}
pNew->data=val;
pTail->pNext =pNew;
pNew->pNext =NULL;
pTail=pNew;
}
return pHead;
}
3.遍历:
void traverse_list(PNODE pHead)
{
PNODE p=pHead->pNext;
while(p!=NULL)
{
cout<<p->data<<'\t';
p=p->pNext ;
}
cout<<endl;
return ;
}
4.插入/删除:
bool insert_list(PNODE pHead,int pos,int val)
{
int i=0;
cout<<"请输入需要插入元素的位置和值"<<endl;
cin>>pos>>val;
PNODE p=pHead;
while(p!=NULL&&i<pos-1)
{
p=p->pNext ;
++i;
}
if(i>pos-1||p==NULL)
return false;
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(pNew==NULL)
{
cout<<"动态分配内存失败!"<<endl;
exit(-1);
}
pNew->data =val;
PNODE q=p->pNext ;
p->pNext =pNew;
pNew->pNext =q;
return true;
}
bool delete_list(PNODE pHead,int pos,int *pval)
{
int i=0;
PNODE p=pHead;
cout<<"请输入需要删除的元素的位置"<<endl;
cin>>pos;
while(p!=NULL&&i<pos-1)
{
p=p->pNext ;
++i;
}
if(i>pos-1||p==NULL)
return false;
PNODE q=p->pNext ;
*pval=q->data ;
p->pNext =p->pNext->pNext ;
free(q);
q=NULL;
return true;
}
- 查找:
int locate_list(PNODE p,int x)
{
int i=1;
p=p->pNext;
while(p!=NULL&&p->data!=x)
{
p=p->pNext ;
i++;
}
if(p==NULL)
return 0;
return i;
}
6.排序(冒泡):
void sort_list(PNODE pHead)
{
int i,j,t;
int len=length_list(pHead);
PNODE p,q;
for(i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext)
{
for(j=i+1,q=p->pNext;j<len;++j,q=q->pNext)
{
if(p->data>q->data)//类似于数组中的:a[i]>a[j]
{
t=p->data;//类似于数组中的: t=a[i];
p->data=q->data;//类似于数组中的: a[i]=a[j];
q->data=t;//类似于数组中的: a[j]=t;
}
}
}
}
------》源代码:
#include<iostream>
#include<malloc.h>
#include<stdlib.h>
using namespace std;
//1.结构描述:
typedef struct Node
{
int data;//数据域
struct Node *pNext;//指针域
}NODE,*PNODE;
//2.初始化:
PNODE creat_list()
{
int len;//有效节点的个数。
int i;
int val;//临时存放用户输入节点的值。
PNODE pHead=(PNODE)malloc(sizeof(NODE));
if(pHead==NULL)
{
cout<<"分配失败,程序终止!"<<endl;
exit(-1);//exit(1);
}
PNODE pTail=pHead;
pTail->pNext =NULL;
cout<<"请输入您需要生成的链表节点的个数:len=";
cin>>len;
for(i=0;i<len;i++)
{
cout<<"请输入第"<<i+1<<"个节点的值:";
cin>>val;
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(pNew==NULL)
{
cout<<"分配失败,程序终止!"<<endl;
exit(-1);//exit(1);
}
pNew->data=val;
pTail->pNext =pNew;
pNew->pNext =NULL;
pTail=pNew;
}
return pHead;
}
//3.遍历
void traverse_list(PNODE pHead)
{
PNODE p=pHead->pNext;
while(p!=NULL)
{
cout<<p->data<<'\t';
p=p->pNext ;
}
cout<<endl;
return ;
}
//判空
bool is_empt(PNODE pHead)
{
if(pHead->pNext==NULL)
return true;
else
return false;
}
//求长度
int length_list(PNODE pHead)
{
PNODE p=pHead->pNext;
int len=0;
while(p!=NULL)
{
len++;
p=p->pNext;
}
return len;
}
//4. 插入/删除:在pHead所指向链表的第pos个节点的前面插入一个新的节点,新节点的值是val,并且pos的值是从1开始。
bool insert_list(PNODE pHead,int pos,int val)
{
int i=0;
cout<<"请输入需要插入元素的位置和值"<<endl;
cin>>pos>>val;
PNODE p=pHead;
while(p!=NULL&&i<pos-1)
{
p=p->pNext ;
++i;
}
if(i>pos-1||p==NULL)
return false;
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(pNew==NULL)
{
cout<<"动态分配内存失败!"<<endl;
exit(-1);
}
pNew->data =val;
PNODE q=p->pNext ;
p->pNext =pNew;
pNew->pNext =q;
return true;
}
bool delete_list(PNODE pHead,int pos,int *pval)
{
int i=0;
PNODE p=pHead;
cout<<"请输入需要删除的元素的位置"<<endl;
cin>>pos;
while(p!=NULL&&i<pos-1)
{
p=p->pNext ;
++i;
}
if(i>pos-1||p==NULL)
return false;
PNODE q=p->pNext ;
*pval=q->data ;
p->pNext =p->pNext->pNext ;
free(q);
q=NULL;
return true;
}
//5.查找:
int locate_list(PNODE p,int x)
{
int i=1;
p=p->pNext;
while(p!=NULL&&p->data!=x)
{
p=p->pNext ;
i++;
}
if(p==NULL)
return 0;
return i;
}
//6.排序(冒泡):
void sort_list(PNODE pHead)
{
int i,j,t;
int len=length_list(pHead);
PNODE p,q;
for(i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext)
{
for(j=i+1,q=p->pNext;j<len;++j,q=q->pNext)
{
if(p->data>q->data)//类似于数组中的:a[i]>a[j]
{
t=p->data;//类似于数组中的: t=a[i];
p->data=q->data;//类似于数组中的: a[i]=a[j];
q->data=t;//类似于数组中的: a[j]=t;
}
}
}
}
int main()
{
PNODE pHead=NULL;
NODE *head=NULL;
int val=12,pos=10,x,loc;
pHead=creat_list();
traverse_list(pHead);
int len=length_list(pHead);
cout<<"链表的长度是:"<<len<<endl;
if(is_empt(pHead))
cout<<"链表为空!"<<endl;
else
cout<<"链表不空!"<<endl;
if(insert_list(pHead,pos,val))
cout<<"插入成功!"<<endl;
else
cout<<"插入失败!"<<endl;
cout<<"插入之后的链表内容是:"<<endl;
traverse_list(pHead);
if(delete_list(pHead,pos,&val))
cout<<"删除成功!"<<endl;
else
cout<<"删除失败!"<<endl;
cout<<"删除之后的链表内容是:"<<endl;
traverse_list(pHead);
cout<<"请输入需要查找的元素的值:"<<endl;
cin>>x;
loc=locate_list(pHead,x);
if(loc>0)
{
cout<<"找到了!"<<endl;
cout<<x<<"是链表中第"<<loc<<"个元素"<<endl;
}
else
cout<<"查找失败!"<<endl;
sort_list(pHead);
traverse_list(pHead);
return 0;
}
链表和数组是数据结构最基本的地基,同时它们也为以后的树图结构做了引申,就像血骨一样最基础也最要紧。