#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{ //定义单链表结点类型
int data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//初始化一个单链表(带头结点)
bool InitList(LinkList &L){
L =(LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L==NULL){
return false;
}
L->next = NULL; //头结点之后暂时还没有结点
return true;
}
int main(){
LinkList L; //声明一个指向单链表的指针
InitList(L); //初始化一个空表
LinkList add_List(LinkList &L);
add_List(L);
LNode *GetElem(LinkList L,int i);
LNode *s,*point=L;
LNode *p=GetElem(L,8); //获取第i-1个元素
//创建一个结点并插入到第i个元素之前
s=(LNode *)malloc(sizeof(LNode)); //分配一个头结点
s->data=26;
s->next = p->next;
p->next =s;
while(point->next!=NULL){
point=point->next;
printf("%d\n",point->data);
}
printf("------------------------\n");
//插入到i前:从直接插入到i前转换为插入到i后变为i前
int temp;
p=GetElem(L,3); //获取第i个元素
//创建一个结点并插入到第i个元素之前
s=(LNode *)malloc(sizeof(LNode)); //分配一个头结点
s->data=66;
s->next =p->next;
p->next =s;
temp=p->data;
p->data = s->data;
s->data=temp;
point=L;
while(point->next!=NULL){
point=point->next;
printf("%d\n",point->data);
}
printf("------------------------\n");
//删除结点 i
LNode *q;
p=GetElem(L,5); //获取第i个元素 找到前驱结点i-1
q=p->next;
p->next=q->next;
free(q);
point=L;
while(point->next!=NULL){
point=point->next;
printf("%d\n",point->data);
}
printf("------------------------\n");
//删除i结点:从找到i结点的前驱结点转换为将后记结点向前移删除后继结点
p=GetElem(L,7); //获取第i个元素
q=p->next;
p->data =p->next->data;
p->next =q->next;
free(q);
point=L;
while(point->next!=NULL){
point=point->next;
printf("%d\n",point->data);
}
printf("------------------------\n");
//求表长
int number=0;
point=L;
while(point->next!=NULL){
point=point->next;
number++;
}
printf("%d\n",number);
return 0;
}
//按序号查找结点值
LNode *GetElem(LinkList L,int i){
int j=1;
LNode *p=L->next;
if(i==0){
return L;
}
if(i<0){
return NULL;
}
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
//按值查找表结点
LNode *LocateElem(LinkList L,int e){
LNode *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
}
return p;
}
//给链表添加一些结点
LinkList add_List(LinkList &L){
int i;
LNode *s,*r=L;
for(i=1;i<=10;i++){
s =(LNode *)malloc(sizeof(LNode)); //创建一个结点
s->data =i;
r->next =s;
r=s;
}
r->next =NULL;
return L;
}