单链表的基本操作

// ListDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

#include "pch.h"
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
typedef int Status;
typedef int ElemType;
typedef struct LNode {
    ElemType data;
    struct LNode *next;
}*Link;
typedef struct {
    Link head, tail;
    int len;
}LinkList;
/*分配结点*/
Status MakeNode(Link &p,ElemType e) {
    p = (Link)malloc(sizeof(struct LNode));
    if (!p)
    	return ERROR;
    p->data = e;
    p->next = NULL;
    return OK;
}
/*释放结点*/
Status FreeNode(Link &p) {
	if (!p)
		return ERROR;
	free(p);
	return OK;
}
/*初始化链表*/
Status InitList(LinkList &L) {
	L.head = (Link)malloc(sizeof(struct LNode));
	if (!L.head)
		return ERROR;	
	L.head->next = NULL;
	L.tail = L.head;
	L.len = 0;
	return OK;
}
/*销毁链表*/
Status DestroyList(LinkList &L) {
	Link p,q;
	p = L.head;
	while (p) {
		q = p;
		free(q);
		p = p->next;
	}
	L.head = L.tail = NULL;
	return OK;
}
/*清空链表*/
Status ClearList(LinkList & L) {
	Link p,q;
	p = L.head->next;
	while (p) {
		q = p;
		free(q);
		p = p->next;
	}
	L.head->next = NULL;
	L.head = L.tail;
	L.len = 0;
	return OK;
}
/*插入第一个结点前面*/
Status InFirst(Link h, Link s) {
	s->next = h->next;
	h->next = s;
	return OK;
}
/*删除第一个结点*/
Status DelFirst(Link h,Link &q) {
	Link p = h->next;
	p = q;	
	h->next = q->next;
	free(p);
	return OK;
}
/*将指针s所指一串结点连接到L的最后一个结点*/
Status Append(LinkList &L,Link s) {
	Link q = s, t = NULL;
	int i = 0;
	L.tail ->next= s;
	while (q) {
		t = q;
		q = q->next;
		i++;
	}
	L.len += i;
	L.tail = t;
	return OK;
}
/*移除尾节点,并使尾指针指向新的结点*/
Status Remove(LinkList &L,Link &q) {
	Link p = L.head->next;
	Link t = NULL;
	q = L.tail;
	while (p != L.tail) {
		t = p;
		p = p->next;
	}
	L.tail = t;
	L.len--;
	free(q);
	return OK;
}
/*已知p指向链表的一个结点,将s所指结点插入到p所指结点之前,并修改p所指向新节点*/
Status InsBefore(LinkList &L, Link&p, Link s) {
	Link q = L.head->next;
	Link t = NULL;
	while (q!= p) {
		t = q;
		q = q->next;
	}
	s->next = t;
	t->next = s;
	p = s;
	L.len++;
	return OK;
}
/*已知p指向链表的一个结点,将s所指结点插入到p所指结点之后,并修改p所指向新节点*/
Status InsAfter(LinkList &L,Link &p,Link s) {
	s->next = p->next;
	p->next = s;
	p = s;
	L.len++;
	return OK;
}
/*已知p指向一个结点,用e更新节点的数据域*/
Status SetCurElem(Link &p,ElemType e) {
	p->data = e;
	return OK;
}
/*已知p指向一个结点,返回p结点所指数据元素*/
ElemType GetCurElem(Link p) {
	return p->data;
}
/*判断线性表是否为空*/
Status ListEmpey(LinkList L) {
	if (L.len == 0 || L.head == L.tail)
		return OK;
	return ERROR;
}
/*返回链表的长度*/
int ListLength(LinkList L) {
	return L.len;
}
/*返回链表表头的位置*/
Link GetHead(LinkList L) {
	return L.head;
}
/*返回链表所指最后结点*/
Link GetLast(LinkList L) {
	return L.tail;
}
/*已知p所指链表的一个结点,返回其前驱的位置。若无前驱,返回NULL*/
Link PriorList(LinkList L,Link p) {
	if (p == L.head)
		return NULL;
	Link q = L.head;
	while (q->next!= p) {
		q = q->next;
	}
	return q;
}
/*已知p所指链表的一个结点,返回其后继的位置,若无后继,返回NULL*/
Link NextList(LinkList L,Link p) {
	if (p == L.tail)
		return NULL;
	Link q = L.head->next;
	while (q!= p) {
		q = q->next;
	}
	return q;
}
/*返回p所指链表的第i个结点的位置,并返回OK,i值不合法时返回ERROR*/
Status LocatePos(LinkList L,int i,Link &p) {
	if (i < 1||i > L.len)
		return ERROR;
	int j = 0;
	Link q = L.head;
	while (j < i) {
		q = q->next;
		j++;
	}
	p = q;
	return OK;
}
/*遍历链表*/
void ListTraverse(LinkList L) {
	Link p = L.head->next;
	while (p) {
		printf("%d ",p->data);
	}
}
int main()
{
	LinkList L;
	Link p, s1, s2;
	int e, len;
	MakeNode(p,10);
	MakeNode(s1,10);
	InitList(L);
	Link h = L.head;
	InFirst(h,s1);
	printf("%d",s1->data);

	return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值