单链表方法结构
//带头节点初始化
void with_head_initlist( linklist & l)
//不带头节点初始化
void without_head_initlist( linklist & l)
//下面均为带头结点的
int size(linklist l)
//带头结点的头插法创建单链表
void head_insert(linklist &l)
//带头节点的尾插法创建单链表,当读入9999时停止插入
void tail_insert(linklist &l)
//不带头结点的,头插法创建长度为n的带头结点单链表,逆序插入100-99-98-。。。1
linklist headinsert(linklist &l,int n)
//以不带头结点的方式尾插法创建长度为n的链表
linklist Tailinsert(linklist &L,int n)
//打印不带头结点创建的列表的内容
void without_head_printlist(linklist L)
//打印带头结点创建的列表的内容
void with_head_printlist(linklist L)
//计算链表的长度(带头结点型链表)
int get_length(linklist l)
//按序号查找结点(带头结点的链表)
lnode * get_element(linklist l,int position )
//按值查找结点
lnode * locate_element(linklist l,int element )
//往第i位置插入元素,思想是找到前一个结点也就是第i-1个结点所在位置插入
bool insert_node(linklist l,int element,int position)
}
代码集合
#include <iostream>
#include<stdlib.h>
typedef struct lnode{//由于结构体内部使用了lnode所以这里定义的时候不能省略
int data;
struct lnode *next;
}lnode,* linklist;//结构体指针
//带头节点初始化
void with_head_initlist( linklist & l){
l=(lnode *)malloc(sizeof (lnode));//
l->next=NULL;//指针域为零表示到达尾结点
}
//不带头节点初始化
void without_head_initlist( linklist & l){
l=NULL;
}
//下面均为带头结点的
int size(linklist l){
int i=0;
lnode *p=l;
while (p->next!=NULL){//头结点不计入单链表的长度
p=p->next;
i++;
}
return i;
}
//带头结点的头插法创建单链表
void head_insert(linklist &l){
l=(linklist)malloc(sizeof(lnode));
l->next=NULL;
//完成头结点的定义
int value;
lnode *p,*r;
scanf("%d",&value);
while(value!=9999){
r=l->next;
p= (lnode*)malloc(sizeof(lnode));
p->data=value;
p->next=r;
l->next=p;
scanf("%d",&value);
}
}
//带头节点的尾插法创建单链表,当读入9999时停止插入
void tail_insert(linklist &l){
l=(linklist)malloc(sizeof(lnode));
l->next=NULL;
//完成头结点的定义
int value;
lnode *p,*r;
scanf("%d",&value);
r=l;
while(value!=9999){
p= (lnode*)malloc(sizeof(lnode));
p->data=value;
//新结点p成型
r->next=p;
r=p;
scanf("%d",&value);
}
r->next=NULL;
}
//不带头结点的,头插法创建长度为n的带头结点单链表,逆序插入100-99-98-。。。1
linklist headinsert(linklist &l,int n){
l=(linklist)malloc(sizeof(lnode));
l->data=1;
l->next=NULL;
lnode *s;
for (int i=2;i<=n;i++){
s=(lnode *) malloc(sizeof(lnode));//必须得先给结构体分配存储空间才能进行数据的赋值
s->data=i;
s->next=l;
l=s;
}
return l;
}
//以不带头结点的方式尾插法创建长度为n的链表
linklist Tailinsert(linklist &L,int n){
int x=1;
L= (linklist)malloc(sizeof(lnode));
L->data=x++;//相当于l->data=x;x=x+1;
lnode *s,*r=L;
while(x!=n+1){
s=(lnode*) malloc(sizeof(lnode));//每次插入结点之前必须先初始化并分配空间
s->data=x;
r->next=s;
r=s;
x++;
}
r->next=NULL;
return L;
}
//打印不带头结点创建的列表的内容
void without_head_printlist(linklist L)
{
while(L!=NULL)
{
printf("%d",L->data);//打印当前结点数据
L=L->next;//指向下一个结点
if(L!=NULL)
{
printf(" ");
}
}
printf("\n");
}
//打印带头结点创建的列表的内容
void with_head_printlist(linklist L)
{
L=L->next;
while(L!=NULL)
{
printf("%d",L->data);//打印当前结点数据
L=L->next;//指向下一个结点
if(L!=NULL)
{
printf(" ");
}
}
printf("\n");
}
//计算链表的长度(带头结点型链表)
int get_length(linklist l){
l=l->next;
int length=0;
while(l!=NULL){
l=l->next;
length++;
}
return length;
}
//按序号查找结点(带头结点的链表)
lnode * get_element(linklist l,int position ){
if(position<0){
return NULL;
}
int i=0;
while (l&&i<position){
l=l->next;
i++;
}
return l;
}
//按值查找结点
lnode * locate_element(linklist l,int element ){
l=l->next;
while (l->data!=element && l!=NULL){
l=l->next;
}
return l;
}
//往第i位置插入元素,思想是找到前一个结点也就是第i-1个结点所在位置插入
bool insert_node(linklist l,int element,int position){//由于头结点指针不发生改变所以不需要添加引用l
lnode *p,*s;
s=(lnode *)malloc(sizeof(lnode));
s->data=element;
p=get_element(l,position-1);
if(p==NULL){
return false;
}
s->next=p->next;
p->next=s;
return true;
}
int main() {
linklist l1,l2;
lnode *p,*q;//这里表示创建了一个lnode型指针
// Tailinsert(l1,100);//尾插法正序插入1-100
// without_head_printlist(l1);
// printf("\n head insert result \n");
// headinsert(l2,100);//头插法可实现逆序插入100-1
// without_head_printlist(l2);
// printf("l1 length is%d,l2 length is %d", get_length(l1), get_length(l2));//由于get_length计算长度是按带有头结点计算的所以长度均为99
head_insert(l1);
with_head_printlist(l1);
p=get_element(l1,4);
printf("preforward element is %d\n",p->data);
// q= locate_element(l1,10);
// printf("locate element with is value is %d\n",q->data);
//在5位置插入元素10
insert_node(l1,10,5); //让元素10成为第五个结点
printf("following is insert result\n");
with_head_printlist(l1);
return 0;
}