#include<stdio.h>
#include<malloc.h>
#define MaxSize 10
typedef int ElemType;//要加分号
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//创建操作有俩种:头插法和尾插法
//头插法
LinkList createList1(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));//初始化一个节点 (头结点)
L->next = NULL;
LNode *s;//该节点用来存放新节点的信息
int x;
scanf("%d",&x);
while(x<=9999){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
LinkList createList2(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));//无论是头插法还是尾插法L指向的都是头结点
LNode *s,*r = L;//r初始值指向头结点,事后总是指向尾节点
scanf("%d",&x);
while(x!=9999){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;//因为r节点是尾节点,所以他的下一个节点总是空节点
return L;
}
//查询 按序号查询
LinkList getElemById(LinkList L,int i){
int j = 1;
LinkList p = L->next;
if(i==0) return L;
if(i<0) return NULL;
//判断条件:p存在 j<i(很精髓 开始设置j = 1,并且把i = 0当成特殊情况处理 j小于i跳出循环是j = i)
while(p&&j<i){
p = p->next;
j++;
}
return p;
}
//查找 按值查找
LinkList getElemByValue(LinkList L,int e){
LinkList p = L->next;
while(p&&p->data!=e){
p = p->next;
}
return p;
}
//插入 插入第i节点要找到第i-1个节点
void insertList(LinkList &L,int n,int d){
LinkList p,s;
s = (LinkList)malloc(sizeof(LNode));//必须要初始化
p = getElemById(L,n-1);//找到需要插入节点的前一个位置
s->data = d;
s->next = p->next;
p->next = s;
}
//删除节点
void deleteList(LinkList &L,int i){
LinkList p,q,s;
s = (LinkList)malloc(sizeof(LNode));//必须要初始化
p = getElemById(L,i-1);//找到需要插入节点的前一个位置
q = p->next;
p->next = q->next;
}
//显示链表信息
void show(LinkList L){
LinkList p = L->next;
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
}
int main(){
LinkList L,find;
//测试创建的俩种方法
//createList1(L);
createList2(L);
//测试按序号查找
// find = getElemById(L,3);
// printf("%d",find->data);
//测试按值查询
// find = getElemByValue(L,34);
// printf("%d",find->data);
//测试插入节点
// insertList(L,3,56);
// show(L);
//测试删除
deleteList(L,2);
show(L);
}