#include "stdlib.h"
#include <stdio.h>
#define Elemtype int
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode, *Linklist;
Linklist Creatlist1(Linklist &L){
//从表尾到表头逆向建立单链表L,每次均在头节点之后加入插入元素
LNode *s; int x;
L=(Linklist)malloc(sizeof(LNode)); //创建头节点
L->next=NULL; //初始链表
scanf("%d",&x);
while(x!=9999) //当输入9999时表示结束
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
Linklist Creatlist2(Linklist &L){
//从表尾插入,正向建立链表
LNode *s,*r=L; //附加一个指向表尾节点的指针
int x;
L=(Linklist)malloc(sizeof(LNode)); //创建头节点
L->next=NULL; //初始链表
scanf("%d",&x);
while(x!=9999) //当输入9999时表示结束
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
LNode *Getelem(Linklist L,int i){
//查找链表里的第i个元素,并返回
int j=1; //计数初始为1
LNode *p=L->next; //头节点赋给p
if(i==0) return L; //若i=0,则返回头节点
if(i<0) return NULL; //若i无效,则返回NULL
while(p&&j<i){
p=p->next;
j++;
}
return p; //返回第i个结点的指针,如果i大于表长,p=NULL,直接返回p即可
}
LNode *Locatelem(Linklist L,Elemtype e){
//本算法查找单链表L(带头结点)中数据域等于e的指针,否则返回NULL
LNode *p=L->next;
while(p!=NULL&&p->data!=e) p=p->next;
return p; //找到成功后返回该结点的指针,否则返回NULL
}
int Getlength(Linklist L){
//求链表的表长
int i=0;
LNode *p=L->next; //将头节点赋给p
while(p!=NULL) {
p=p->next;
i++;
}
return i;
}
Linklist insertlist1(Linklist &L,Elemtype e,int i){
//在第i个位置插入元素e(前插操作)
LNode *s=(LNode*)malloc(sizeof(LNode));
LNode *r =Getelem(L, i-1);;
s->data=e;
s->next=r->next;
r->next=s;
return L;
}
Linklist insertlist2(Linklist &L,Elemtype e,int i){
//在第i个位置插入元素e(后插操作),先做前插操作,后交换两个结点的数据域
LNode *s=(LNode*)malloc(sizeof(LNode));
LNode *r =Getelem(L, i-1);;
s->data=e;
s->next=r->next;
r->next=s;
Elemtype temp=r->data; //交换数据部分
r->data=s->data;
s->data=temp;
return L;
}
Linklist deletelist(Linklist &L,int i){
//删除链表的第i个元素
if(i<=0) printf("the number is invaild\n");
if(Getlength(L)<i) printf("the number of list isnot enough\n");
LNode *p=Getelem(L, i-1);
LNode *q=p->next; //q指向待删去的结点
p->next=q->next; //将qj结点直接从链中断开
free(q); //释放结点的储存空间
return L;
}
Linklist reverselist(Linklist &L){
//采用头插入创建链表实现链表的就地逆置
LNode *p=L->next; //将头结点赋给p
LNode *q;
L->next=NULL;
while(p!=NULL){
q=p->next;
p->next=L->next;
L->next=p;
p=q; //p指向下一个结点
}
return L;
}
之后的其他操作会后续补充上