线性表链式存储-使用c语言实现,数据结构学习(二)——线性表链式存储-使用c语言实现(手打)...

#include

#include//stdlib 头文件即standard library标准库头文件   stdlib 头文件里包含了C、C++语言的最常用的系统函数

#define OK 1

#define ERROR 0

typedef int ElemType;//使用typedef时要记住,typedef并没有创建任何新类型,它只是为某个已存在的类型增加一个方便使用的标签。

typedef int Status;

//线性表的单链表存储结构

typedef structNode {

ElemType data;//数据域

struct Node *next;//指针域 c语言中指针都是占32bit或者64bit的数据

}Node;

typedef struct Node *LinkList;//定义 LinkList

//获取链表的长度

Status getListLength(LinkList L) {

int i = 0;//计数器

while (L->next)//指针L所指节点中的成员next的是值,若该值为下一个节点的地址既循环条件为真,若是0或null则为假。

{

L = L->next;//把L的下一个节点赋值给L;

i++;

}

return i;

}

//单链表的读取

//用e返回L中第i个数据元素的值 时间复杂度O(n);

Status getElem(LinkList L, int i, ElemType *e) {

int j = 1;//计数器

LinkList p;//声明一个节点p

p = L->next;//让p指向L的第一个节点

while (p&&j

{

p = p->next;//让p指向下一个节点

j++;//自加

}

if (!p || j > i) {//第i个元素不存在

return ERROR;

}

*e = p->data;//取第i个数据

return OK;

}

// 在L中第i个位置前插入新的数据元素e

Status ListInsert(LinkList *L, int i, ElemType e) {

int j;

LinkList p, s;

p = *L;//头指针L付给p

j = 1;

while (p&&j

{

p = p->next;

j++;

}

if (!p||j > i) //第i个元素不存在

return ERROR;

//(指针类型) malloc(内存大小)——》返回一个指针(找一片指定大小的空间,然后将这片空间的首地址给一个指针变量)

s = (LinkList) malloc (sizeof(Node));//生成新节点

s->data = e;//将新节点的数据域赋值为e

s->next = p->next;//将p的后继节点赋值给s的后继节点

p->next = s;//将s赋值给p的后继

return OK;

}

//删除L的第i个元素,并用e返回其值,L的长度剪1;

Status ListDelete(LinkList *L, int i, ElemType *e) {

int j = 1;

LinkList p,q;

p = *L;//头指针付给L

while (p&&j

{

p = p->next;

j++;

}

if (!(p->next) || j > i) {//第i个元素不为空

return ERROR;

}

q = p->next;//q表示第i个元素

p->next = q->next;//第i-1的next赋到i+1上即i的next

*e = q->data;//将q节点的数据给e

free(q);//让系统回收此节点释放内存

return OK;

}

//随机产生N个元素的值,建立带表 头结点 的单链线性表L(头插法)

void CrateListHead(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));

(*L)->next = NULL;//L是指整个单链表,而r是尾部节点的变量

r = *L;//r为指向L尾部的节点

for (i = 0; i < n; i++) {

p = (LinkList)malloc(sizeof(Node));

p->data = rand() % 100 + 1;

r->next = p;//让尾部节点指向p,即p插入到最后

r = p;//然后将p付给r,此时r又为尾部节点

}

r->next = NULL;//当循环结束后,将尾部节点r指向null

}

Status ClearList(LinkList *L) {//清空表L ,L存在

LinkList p,q;

int i = 0;

p = (*L)->next;//p指向第一个节点

while (p)//p不为空

{

q = p->next;//把 p的下一个节点付给 q

free(p);//释放P;

p = q;//把q赋值给p

}

(*L)->next = NULL;

return OK;

}

void TrvalList(LinkList *L) {//打印链表L中所有的 元素

LinkList p;

p = (*L)->next;

while (p)

{

printf("%d", p->data);

printf(" ");

p = p->next;

}

}

int main(void) {

LinkList L;

int a;

CreatListTail(&L, 10);

TrvalList(&L);

getchar();

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值