您的位置:首页 > 其它

创建单线性链表的不同表示方法和操作

2014-08-04 16:03 267 查看
创建单线性链表,常见的有头插法、尾插法创建线性链表,常见的操作有:创建链表、查找、删除、增加元素、求逆链等操作。

这里首先用头插法创建链表:

//头指针唯一确定一个单链表

#define MaxSize 15
typedef int elem_type ;
typedef struct linklist
{
elem_type data;
struct linklist *next;
} Linklist;

//头插入法建立链表:每次将头结点的指针赋值给新结点,然后将新节点赋值给头结点指针
Linklist *CreateList ()
{
Linklist *head,*p;
head =(Linklist *)malloc(sizeof(Linklist));
head->next=NULL;
// p =(Linklist *)malloc(sizeof(Linklist));

int i;
cout<<"随机产生一个数字:"<<endl;
for(i=0;i<MaxSize;i++)
{
int data;
data =rand()%100;
p =(Linklist *)malloc(sizeof(Linklist));

cout<<"第"<<i<<"个数是"<<data<<endl;
p->data =data;
p->next=head->next;
head->next=p;
}
return head;
}
//利用头插法创建的链表有什么特点呢?

这里可以写个查找函数来说明:

定义一个查找函数:

//查找(取出第i个数的值)
elem_type Get_Elem(Linklist *L, int i)
{
int j;
Linklist *p;
p=L->next;
if((i>MaxSize) && (i< 0))
cout<<"输入有效的i值";
for(j=0;j<i-1;j++)
{
p=p->next;
//flag->next++;  //链表不是矩阵,指针自加1不是指向下一个结点,那是矩阵里可以这样。
}
return p->data;
}
编译一下:结果如下

//主函数如下:

int main()
{
Linklist *Q;
Q=CreateList();
int i;
cout<<"输入想要查找的元素号i=";
cin>>i;
int getNum = Get_Elem( Q , i);
cout<<"第"<<i<<"个元素是"<<getNum<<endl;

//Insert_Elem(Q, 3,5);
while(1);
return 0;
}



根据运行结果可知道:对于头插法,输入的结点次序和生成的链表次序相反。

还有可以有:删除元素和增添元素的函数体:

//删除链表中的某个结点
void Delete_Linklist(Linklist *L,elem_type i)
{
Linklist *p,*q;
p=L->next;
int j=0;
if(i<0 && i>MaxSize )
cout<<"j输入有效的i值";
else
{
while((p->next != NULL)&&(j<i-1))
{
p=p->next;  //寻找第i个结点
++j;
}
q=p->next;
p->next=q->next;
free(q);
}
}

//添加结点(在第i个节点处添加一个值)
void Insert_Elem(Linklist *L, int i, elem_type Number)
{
int j;
Linklist *p,*q;
p=L->next;
if((i>MaxSize) && (i< 0))
cout<<"输入有效的i值";
for(j=0;j<i-1;j++)
{
p=p->next;
//flag->next++;  //链表不是矩阵,指针自加1不是指向下一个结点,那是矩阵里可以这样。
}
if(i==j+1)
{
q=(Linklist *)malloc(sizeof(Linklist));
q->data=Number;
q->next=p->next;
p->next=q;
}
//  return p;
}


问题分析:为什么头插法的数据元素顺序和链表中结点顺序相反?

循环第一次时:

p->data =data;          //数据元素第一次赋值
p->next=head->next;    //循环赋值,第一次将NULL赋给p->next,
head->next=p;         //第一次赋值后的p赋给head->next;


循环第二次时:

p->data =data;         //数据元素第二次赋值
p->next=head->next;    //循环赋值,第二次将 (第一次赋值后的<span style="font-family: Arial, Helvetica, sans-serif;">head->next</span><span style="font-family: Arial, Helvetica, sans-serif;">)赋给p->next,</span>
head->next=p;         //第二次赋值后的p赋给head->next;


所以新赋值进来的结点更靠近head->next.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐