单链表:建立、插入、查询、删除、打印输出。
/**
* ----线性表之链表----
* 1.新建链表
* (1)头插法:将元素插到头结点之后
* (2)尾插法:将元素插到最后一个结点
* 2.新增元素
* 3.删除
* 4.查询
*/
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;//数据域
struct LNode *next;//指针域
}LNode,*LinkList;
/**
* ---头插法---
* @param L
*/
void ListHearInsert(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));//为头结点申请内存空间
L->next=NULL;
ElemType x;//链表类型的变量
scanf("%d",&x);//读取一个元素
while(x!=00){
LNode *s=(LinkList)malloc(sizeof(LNode));
s->data=x;//将读入的元素存到新结点的数据域
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
}
/**
* ---尾插法--
* @param L
*/
void ListTailInsert(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
LinkList r;//尾指针
r=L;//初始时尾指针指向头结点
LinkList s ;
ElemType x;
scanf("%d",&x);
while(x!=00){
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
r->next=s;//尾指针指向新结点
r=s;
scanf("%d",&x);
}
r->next=NULL;
}
/**
* ---按位置查找----
* @param L
* @param Postion
* @return
*/
LinkList SearchByBit(LinkList L,int Postion){
if(Postion<0){
return NULL;
}
int i=0;
while(L && i<Postion){
L=L->next;
i++;
}
return L;
}
/**
* ---按值查找----
* @param L
* @param RearchValue
* @return
*/
LinkList SearchByValue(LinkList L,ElemType RearchValue){
while(L){
if(L->data==RearchValue){
return L;
}
L=L->next;
}
return NULL;
}
/**
* ----在第i个位置插入元素---
* @param L
*/
bool ListInsertValue(LinkList L,int i,ElemType InsertValu){
LinkList p;
p= SearchByBit(L,i-1);
if(p==NULL){
return false;
}
LinkList q;
q->data=InsertValu;
q->next=p->next;
p->next=q;
return true;
}
/**
* -----根据位置删除元素-----
* p-> q
* @param L
* @param Position
* @return
*/
bool ListDeleteByBit(LinkList L,int position){
LinkList p; //建立新的指针
p = SearchByBit(L,position-1); //将指针p指向需要删除结点的直接前驱
if(p==NULL){//判断p是否存在
return false;
}
LinkList q; //新建新结点
q=p->next;//将q指向需要删除的结点
p->next=q->next;//将p指向需要删除的结点的直接后继
free(q);//释放断链结点的内存空间
return true; //返回真值
}
/**
* ----打印输出----
* @param L
*/
void ListPrint(LinkList L){
L=L->next;
while(L!=NULL){
printf("%d",L->data);//打印当前结点数据
L=L->next;//指向下一个结点
if(L!=NULL){
printf(" ");
}
}
printf("\n");
}
int main() {
LinkList L;//头指针
//头插法
// ListHearInsert(L);
// ListPrint(L);
//尾插法
ListTailInsert(L);
ListPrint(L);
//删除--根据位置
bool ret;
ret=ListDeleteByBit(L,3);
if(ret){
ListPrint(L);
} else{
printf("false\n");
}
LinkList research;
//按位置查找
research= SearchByBit(L,2);
if(research!=NULL){
printf("%d\n",research->data);
} else{
printf("fasle.\n");
}
//按值查找
research = SearchByValue(L,3);
if(research!=NULL){
printf("%d\n",research->data);
} else{
printf("fasle.\n");
}
//在第i个位置插入元素
printf("Insert value.\n");
ListInsertValue(L,3,88);
ListPrint(L);
return 0;
}