#include <iostream>
using namespace std;
#include <malloc.h>
#include <stdio.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define IINFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 10
#define LISTINCREAMENT 2
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LNode和*LinkList;是与前面的typedef配合起来使用的,意思是给你声明的结构体起一个别名叫LNode,同时起一个指针别名叫LinkList,以后就可以用以下方式声明变量:
LNode a;//声明了一个struct LNode型变量a,与写struct LNode a;等价,省心多了;
LinkList p;//声明了一个struct LNode *型指针变量p,与写struct LNode *p等价,也省心多了。
如果没有前面的typedef,意思就不一样了:LNode就只是一个struct LNode型变量,LinkList也就只是个struct LNode *型指针。
//逆序建立单链表
void CreateList_L(LinkList &L,int n){
//逆位序输入n个元素的值,建立带头结点的单链表L
int i;
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next = NULL;//先建立一个带头结点的单链表
for(i = n;i>0;--i){
p = (LinkList)malloc(sizeof(LNode)); //生成新结点
scanf("%d",&p->data); //插入元素值
p->next = L->next;
L->next = p;//插入到表头
}//CreateList_L
}
//打印单链表
void PrintList_L(LinkList L){
//打印输出链表元素的值
LinkList p=L->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}//PrintList_L
//取第I个元素
Status GetElem_L(LinkList L,int i,ElemType &e){
//L为带头结点的单链表的头指针
//当第i个元素存在时,其赋值给e并返回OK,否则返回ERROR
LinkList p;
p=L->next;
int j=1; //初始化,p指向第一个结点,j为计数器
while(p&&j<i){
//顺时针向后查找,直到P指向第i个元素或p为空
p=p->next;
++j;
}
if(!p||j>i)
return ERROR; //第i个元素不存在
e=p->data; //取第i个元素
return OK;
}//GetElem_L
//插入元素
Status LinkInsert_L(LinkList &L,int i,ElemType e){
//在带头结点的单链线性表L中第i个位置之前插入元素e
LinkList p;
LinkList s;
p=L;
int j=0;
while(p&&j<i-1){ //寻找第i-1个结点
p=p->next;
++j;
}
if(!p||j>i-1)//i小于1或者大于表长加1
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); //生成新结点
s->data=e;
s->next=p->next; //插入L中
p->next=s;
return OK;
}//LinkInsert_L
//删除元素
Status LinkDelete_L(LinkList &L,int i,ElemType &e){
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
LinkList p;
LinkList q;
p=L;
int j=0;
while(p->next&&j<i-1){ //寻找第i个结点,并令p指向其前驱
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return ERROR; //删除位置不合理
q=p->next;
p->next=q->next; //删除并释放结点
e=q->data;
free(q);
}//LinkDelete_L
//主函数
int main()
{
struct LNode;
ElemType e;
LinkList L;
int i,n,t,a,b;
printf("请输入链表中最开始的数据个数\n");
scanf("%d",&n);
printf("请输入链表中最开始的数据\n");
CreateList_L(L,n);
PrintList_L(L);
printf("请输入需要插入元素的位置:");
scanf("%d",&i);
printf("请输入需要插入元素的的值:");
scanf("%d",&e);
t=LinkInsert_L(L,i,e);
if(t==OK)
{
printf("插入成功!");
printf("插入成功后的链表中元素为:\n");
PrintList_L(L);
}
else
{
printf("插入失败!");
}
printf("请输入需要得到指定元素的位置:\n");
scanf("%d",&i);
a=GetElem_L(L, i,e);
if(a==OK)
{
printf("得到成功!");
printf("得到成功后的元素为%d\n",e);
}
else
{
printf("得到失败!");
}
printf("请输入需要删除元素的位置:\n");
scanf("%d",&i);
b=LinkDelete_L(L,i,e);
if(b==OK)
{
printf("删除成功!");
printf("删除的元素为%d\n",e);
printf("删除成功后的链表元素为:\n");
PrintList_L(L);
}
else
{
printf("删除失败!\n");
}
return 0;
}