#include <iostream.h>
struct node
{
int data
node *next
}
class list
{
public:
list(){head=NULL}
void MakeEmpty()
int Length()
void Insert(int x,int i)//将x插入到第i个结点(不含头结点)的之后
void Insertlist(int a,int b)//将节点b插入a之前
int Delete(int x)
int Remove(int i)
int Find(int x)
void Display()
private:
node *head
}
void list::Display()
{
node *current=head
while (current!=NULL)
{
cout<<current->data<<" "
current=current->next
}
cout<<endl
}
void list::MakeEmpty()
{
head=NULL
}
int list::Length()
{int n=1
node *q=head
if(q==NULL)
n=1
else
while(q!=NULL)
{
n++
q=q->next
}
return n
}
int list::Find(int x)//在链表中查找数值为x的结点,成功返回1,否则返回0
{
node *p=head
while(p!=NULL&&p->data!=x)
p=p->next
if(p->data==x)
return 1
else
return 0
}
void list::Insert (int x,int i)//将x插入到第i个结点(不含头结点)的之后;
{
node *p//p中放第i个结点
node *q//q中放i后的结点
node *h//h中存要插入的结点
h=new node
h->data =x
p=head
if(p->next !=NULL) //链表不是只有一个结点或者空链表时候
{
int n=1
while(p->next !=NULL)
{
n++
p=p->next
}// 得到链表的结点的个数
p=head//使p重新等于链首
if(i==n)//i=n时,直接加在最后面就行了
{
while(p->next !=NULL)
p=p->next
p->next=h
h->next =NULL
}
else if(i<n&&i>1)//先找到第i个结点,用p存第i个结点,用q存i后的结点,用h存要插入的结点
{
for(int j=1j<ij++)
p=p->next//找到第i个结点,用p存第i个结点
q=p->next//q存i后的结点
p->next=h
h->next=q
}
else
cout<<"超出链表结点个数的范围"<<endl
}
else
cout<<"这个链表是空链表或者结点位置在首位"<<endl
}
void list::Insertlist(int a,int b)//将b插入到结点为a之前
{
node *p,*q,*s//p所指向的结点为a,s所指为要插入的数b,q所指向的是a前的结点
s=new node
s->data=b
p=head
if(head==NULL)//空链表的时候
{
head=s
s->next=NULL
}
else
if(p->data==a)//a在链首时候
{
s->next=p
head=s
}
else
{
while(p->data!=a&&p->next!=NULL)//使p指向结点a,q指向a之前的结点
{
q=p
p=p->next
}
if(p->data==a)//若有结点a时候
{
q->next=s
s->next=p
}
else//没有a的时候
{
p->next=s
s->next=NULL
}
}
}
int list::Delete(int x)//删除链表中值为x的结点,成功返回1,否则返回0;
{
node *p,*q
p=head
if(p==NULL)
return 0
if(p->data==x)
{
head=p->next
delete p
return 1
}
else
{
while(p->data!=x&&p->next!=NULL)
{q=p
p=p->next
}
if(p->data==x)
{
q->next =p->next
delete p
return 1
}
else
return 0
}
}
int list::Remove(int i)
{
node *p,*q
p=head
if(p!=NULL)
{ int n=1
while(p->next !=NULL)
{
n++
p=p->next
}//得到链表结点的个数
p=head
if(i==n)//i结点在结尾的时候
{
while(p->next!=NULL)
{
q=p
p=p->next
}
q->next=NULL
delete p
return 1
}
else if(i<n&&i>1)//i结点在中间的时候
{
for(int j=1j<ij++)
{
q=p//q中放i前的结点
p=p->next //p中放第i个结点
}
q->next=p->next
delete p
return 1
}
else if(i==1)//i结点在首位的时候
{
q=p->next
head=q
delete p
return 1
}
else
return 0
}
else
return 0
}
void main()
{
list A
int data[10]={1,2,3,4,5,6,7,8,9,10}
A.Insertlist(0,data[0])
for(int i=1i<10i++)
A.Insertlist(0,data[i])
A.Display()
menu:cout<<"1.遍历链表"<<'\t'<<"2.查找链表"<<'\t'<<"3.插入链表"<<endl
cout<<"4.删除链表"<<'\t'<<"5.链表长度"<<'\t'<<"6.置空链表"<<endl
int m
do
{
cout<<"请输入你想要进行的 *** 作(选择对应 *** 作前面的序号):"<<endl
cin>>m
}while(m<1||m>6)//当输入的序号不在包括中,让他重新输入
switch(m)
{
case 1:
{
A.Display ()
goto menu
}break
case 2:
{
cout<<"请输入你想要找到的结点:"<<endl
int c
cin>>c//输入你想要找到的结点
if(A.Find (c)==1)
{
cout<<"可以找到"<<c<<endl
A.Display ()//重新显示出链表A
}
else
{
cout<<"链表中不存在"<<c<<endl
A.Display ()//重新显示出链表A
}
goto menu
}break
case 3:
{
cout<<"请选择你要插入的方式(选择前面的序号进行选择)"<<endl
cout<<"1.将特定的结点加入到特定的结点前"<<'\t'<<"2.将特定的结点加到特定的位置后"<<endl
int b1
do
{
cout<<"请输入你想要插入的方式(选择前面的序号进行选择):"<<endl
cin>>b1
}while(b1<1||b1>2)//当输入的序号不在包括中,让他重新输入
if(b1==1)
{
cout<<"请输入你想要插入的数和想要插入的结点(为此结点之前插入):"<<endl
int a1,a2
cin>>a1>>a2
A.Insertlist (a1,a2)//将a1插入到结点为a2结点之前
cout<<"此时链表为:"<<endl
A.Display ()//重新显示出链表A
}
else
{
cout<<"请输入你想要插入的数和想要插入的位置(为此结点之后插入):"<<endl
int a1,a2
cin>>a1>>a2
A.Insert (a1,a2)//将a1插入到结点位置为a2的结点之后
cout<<"此时链表为:"<<endl
A.Display ()//重新显示出链表A
}
goto menu
}break
case 4:
{
cout<<"请选择你要删除的方式(选择前面的序号进行选择)"<<endl
cout<<"1.删除特定的结点"<<'\t'<<"2.删除特定位置的结点"<<endl
int b1
do
{
cout<<"请输入你想要插入的方式(选择前面的序号进行选择):"<<endl
cin>>b1
}while(b1<1||b1>2)//当输入的序号不在包括中,让他重新输入
if(b1==1)
{
cout<<"请输入你想要删除的结点:"<<endl
int a
cin>>a//输入你想要删除的结点
if(A.Delete (a)==1)
{
cout<<"成功删除"<<a<<endl
cout<<"删除后的链表为:"<<endl
A.Display ()
}
else
{
cout<<"此链表为:"<<endl
A.Display ()//重新显示出链表A
cout<<"链表中不存在"<<a<<endl
}
}
else
{
cout<<"请输入你想要删除的结点位置:"<<endl
int b
cin>>b//输入你想要删除的结点的位置
if(A.Remove(b)==1)
{
cout<<"成功删除第"<<b<<"个结点"<<endl
cout<<"删除后的链表为:"<<endl
A.Display ()//重新显示出链表A
}
else
{
cout<<"当前链表的结点个数为:"<<A.Length ()<<endl
cout<<"您输入的结点位置越界"<<endl
}
}
goto menu
}break
case 5:
{
cout<<"这个链表的结点数为:"<<A.Length ()<<endl
goto menu
}break
case 6:
{
A.MakeEmpty ()
cout<<"这个链表已经被置空"<<endl
goto menu
}break
}
}
评论(3)|1
sunnyfulin |六级采纳率46%
擅长:C/C++JAVA相关Windows数据结构及算法百度其它产品
按默认排序|按时间排序
其他1条回答
2012-04-23 17:41121446881|六级
我写了一个C语言的,只给你两个结构体和一个初始化函数:
#include "stdio.h"
#include "malloc.h"
struct adjacentnext//邻接表项结构体
{
int element
int quanvalue
struct adjacentnext *next
}
struct adjacenthead//邻接表头结构体
{
char flag
int curvalue
int element
struct adjacenthead *previous
struct adjacentnext *son
}
//初始化图,用邻接表实现
struct adjacenthead *mapinitialnize(int mapsize)
{
struct adjacenthead *ahlists=NULL
struct adjacentnext *newnode=NULL
int i
int x,y,z
ahlists=malloc(sizeof(struct adjacenthead)*mapsize)
if(ahlists==NULL)
return NULL
for(i=0i<mapsizei++)
{
ahlists[i].curvalue=0
ahlists[i].flag=0
ahlists[i].previous=NULL
ahlists[i].son=NULL
ahlists[i].element=i+1
}
scanf("%d%d%d",&x,&y,&z)//输入源结点,目的结点,以及源结点到目的结点的路权值
while(x!=0&&y!=0)//x,y至少有一个零就结束
{
newnode=malloc(sizeof(struct adjacentnext))
newnode->element=y
newnode->quanvalue=z
newnode->next=ahlists[x-1].son
ahlists[x-1].son=newnode
scanf("%d%d%d",&x,&y,&z)
}
return ahlists//返回邻接表头
}
邻接表还是逆邻接表?如果是逆邻接表,每个顶点出发邻接表的
链表
中的结点个数就是
入度
如果是邻接表过程如下:有一个辅助数组,大小就是顶点数量,所有元素初值都为0从头到尾遍历每个顶点出发的邻接表的结点,只要当前结点的数据是几(也就是第几个结点被有向弧进入了),这个下标的辅助
数组元素
加1,等所有的邻接表的小链表遍历完了,这个辅助数组中各个下标的数字就是该顶点的入度
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)