0、宏定义与单链表结构体
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define error 1
#define OK 0
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode; //单链表结点结构体
typedef LNode* LinkList;//单链表结点指针
1、建立一个单链表
//建立链表,为一个头结点指针分配空间,要提前有一个头结点指针
Status InitList(LinkList &L)//参数为指针的引用,使在子函数中分配的空间不会被释放
{
L=(LinkList)malloc(sizeof(LNode));//为头结点指针分配动态空间
if(L==NULL)
{
printf("动态内存分配失败\n");
exit(0);
}
L->next=NULL;
}
2、销毁一个单链表(只留一个头结点指针,头结点空间释放)
Status DestroyList(LinkList &L)
{
LinkList p,q;
p=L;
q=p->next;
while(p)
{
free(p);
p=q;
if(q)
{
q=q->next;
}
}
return OK;
}
3、清空一个单链表(保留头结点,包括头结点指针和头结点空间)
Status ClearList(LinkList &L)//
{
LinkList p,q;
p=L->next;
q=p->next;
while(p)
{
free(p);
p=q;
if(q)
{
q=q->next;
}
}
L->next=NULL;
return OK;
}
4、插入一个结点
//插入一个结点,传入头结点指针,在第i个元素前插入一个元素
Status InsertList(LinkList &L,int i,ElemType e)
{
LinkList p;
p=L;
j=0;
while(p&&j<i-1)//使指针p指向第i个元素的前驱,可以在表尾后插入元素
{
p=p->next;
j++
}
if(!p||j>i-1)
{
return error;
}
LinkList s;
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
5、删除一个结点
//删除一个结点(删除结点涉及三个位置的指针)
//传入头结点指针,删除链表中第i个元素,并获得该结点数据域
Status ListDelete(LinkList &L,int i,ElemType &e)
{
LinkList p,q;
p=L;
j=0;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)||j>i-1)
{
return error;
}
q=p->next;p->next=q->next;
e=q->data;free(q);
return OK;
}
6、获取第i个结点的数据
Status GetElem(LinkList L,int i,ElemType &e)
{
LinkList p;
p=L.next;
int j=1;
while(p||j<i)//j的最大可能值为i
{
p=p->next;
j++
}
if(p||j>i)
{
return error;
}
else
{
e=p->data;
return OK;
}
}