数据结构——链表
顺序结构
头定义
#define MAXSIZE 20 /*存储空间初始分配量*/
typedef int Elemtype;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
结构定义
typedef struct
{
Elemtype data[MAXSIZE];
int length;
}sqlist;
获得线性表元素
Status GetElem(sqlist L,int i,Elemtype *e)
{
if(L.length==0 || i > L.length)
return ERROR;
*e = L.data[i-1];
return OK;
}
插入元素操作
//插入操作(第i个位置知之后)
Status Insert(sqlist *L,int i,Elemtype e)
{
if(L->length==MAXSIZE || i > L->length)
return ERROR;
if(i<1 || i>L->length+1)
return ERROR;
for(i;i < L->length;i++)
{
L->data[i] = L->data[i-1];
}
L->data[i-1] = e;
L->length++;
return OK;
}//自己写的,书上是倒着遍历
/*书上的
Status Insert(sqlist *L,int i,Elemtype e)
{
int k;
if(L->length==MAXSIZE)
return ERROR;
if(i<1 || i>L->length+1)
return ERROR;
if(i<=L->length)
{
for(l=L->length-1;k>=i-1;k--)
L->data[k+1] = L->data[k];
}
L->data[i-1] = e;
L->length++;
return OK;
}
*/
删除元素操作
//删除操作
/*操作结果:删除L的第i个数据元素。并用e返回其值,L的长度减1*/
Status ListDelete(sqlist *L,int i,Elemtype *e)
{
int k;
if(L->length == 0)
return ERROR;
if(i < 1 || i > L->length)
return ERROR;
*e = L->data[i - 1];
for(k = i -1;k < L->length;i++)
L->data[i-1] = L->data[i];
L->length--;
return ERROR;
}
链式结构
结构定义
typedef struct Node
{
Elemtype data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
获得线性表元素
Status GetElem(LinkList L,int i,Elemtype *e)
{
int j;
LinkList p;
p = L->next;
j = 1;
while (p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i)
return ERROR;
*e = p->data;
return OK;
}
插入元素操作
Status ListInsert(LinkList *L,int i,Elemtype e)
{
int j;
LinkList p,s;
p = *L;//p指向链表头结点;
j = 1;
while(p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i)
return ERROR;
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
删除元素操作
Status ListDelete(LinkList *L,int i,Elemtype *e)
{
int j;
LinkList p;
p = *L;//p指向链表头结点;
j = 1;
while(p && j<i)//遍历寻找第i-1个结点
{
p = p->next;
++j;
}
if(!p || j>i)
return ERROR;
*e = p->next->data;
p->next = p->next->next;
free(p->next);
return OK;
}
单链表的整表创建
头插法
void CreatListHead(LinkList *L,int n)
{
LinkList p;
int i;
srand(time(0));//初始化随机数种子
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;//先建立一个带头结点的单链表
for(i=0; i<n; i++)
{
p = (LinkList)malloc(sizeof(Node));//生成新结点
p->data = rand()%100+1;//随机生成100以内的数字
p->next = (*L)->next;
(*L)->next = p;//插入到表头
}
}
尾插法
void CreatListTail(LinkList *L,int n)
{
LinkList p,r;
int i;
srand(time(0));//初始化随机数种子
*L = (LinkList)malloc(sizeof(Node));
r = *L;//r为指向尾部的结点
for(i=0; i<n; i++)
{
p = (LinkList)malloc(sizeof(Node));//生成新结点
p->data = rand()%100+1;//随机生成100以内的数字
r->next = p;//将表尾终端节点的指针指向新结点
r = p;//将当前的新结点定义为表尾终端结点
}
r->next = NULL;//表示当前链表结束
}
单链表的整表删除
Status ClearList(LinkList *L)
{
LinkList p,q;
p = (*L)->next;//p指向第一个结点
while(p)//没到表尾
{
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;//头结点指针域为空
return OK;
}
版权声明:本文为weixin_45639685原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。