#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
// 初始化链表
void InitList(LinkList &L){
L->next = NULL;
}
//头插法创建链表
void CreatList_head_insert(LinkList &L){
int x;
LNode *s;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x); //根据数据类型改变
while(x!=9999){
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d" ,&x);
}
}
//尾插法创建链表
void CreatList_tail_insert(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));
LNode *s,*r=L; //这句记得在L申请完地址之后使用
scanf("%d",&x);
while(x!=9999){
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next = NULL;
}
//按序号查找结点值
LinkList GetElem(LinkList L,int i){
int j=1;
LNode *p = L->next;
if(i==0){
return L;
}
if(i<1){
return NULL;
}
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
//插入结点操作(在第i个位置上插入)
void InsertElem(LinkList L,int i,ElemType e){
LinkList p;
LNode *s;
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
p=GetElem(L,i-1);
s->next=p->next;
p->next=s;
}
//删除第i个结点操作
void DeletElem(LinkList L,int i){
LinkList p,q;
p=GetElem(L,i-1);
q=p->next;
p->next=q->next;
free(q);
}
//打印链表
void PrintList(LinkList L){
LinkList p;
for(p=L->next;p;p=p->next){
printf("%d ",p->data);
}
printf("\n");
}
//判断是不是空表
bool isEmpty(LinkList L){
return L->next == NULL;
}
int main(){
int i,e;
LinkList L,p;
// p = (LinkList) malloc (sizeof(LNode));
printf("===情依次输入数字,以9999结尾\n");
CreatList_tail_insert(L);
if(isEmpty(L)){
printf("表空!\n");
}
printf("链表中各结点存储数据为:");
PrintList(L);
printf("===请输入想查找第几个节点的值:\n");
scanf("%d",&i);
p=GetElem(L,i);
printf("第%d个结点中的数据为%d\n",i,p->data);
printf("===请输入你想在第几个位置插入新的结点:");
scanf("%d",&i);
printf("\n===请输入你想在第%d个位置插入的新结点中存储的数据:",i);
scanf("%d",&e);
printf("\n");
InsertElem(L,i,e);
PrintList(L);
printf("===请输入想删除第几个结点:");
scanf("%d",&i);
DeletElem(L,i);
printf("删除后的链表为:");
PrintList(L);
/* 测试链表的初始化
printf("======\n");
InitList(L);
if(isEmpty(L)){
printf("表空!\n");
}
PrintList(L);
*/
}