C语言基础——链表的相关操作
1 #include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
#include <stdlib.h> typedef int elemtype; #define TRUE 0
#define FALSE 1
#define OK 1
#define ERROR 0
#define INFEASIBLE -1 #if(1) typedef struct LNode
{
struct LNode *next;
int date;
}*LinkList; //typedef LNode *LinkList; #endif #if(0) typedef struct LNode
{
struct LNode *next; elemtype data;
}; #endif void InitList(LinkList L)
{
L = (LinkList)malloc(sizeof(struct LNode));
if(!L)
{
exit(-);
}
L->next = NULL;
} void DestroyList(LinkList L)
{
LinkList q;
while(L)
{
q = L->next;
free(L);
L = q;
}
} void ClearList(LinkList L)
{
LinkList p, q;
p = L->next; //p = L的话就销毁了链表相当于DestroyList
while(p)
{
q = p->next;
free(p);
p = q;
} L->next = NULL;
} int ListEmpty(LinkList L)
{
if(L->next)
{
return FALSE;
} return TRUE;
} int ListLength(LinkList L)
{
int i = ;
LinkList p = L->next; //应该设立一个新的指针代替L, while(p)
{
i++;
p = p->next;
} return i;
} int GetElem(LinkList L, int i, elemtype *e)
{
int j;
LinkList p;
p = L; for(j = ; j < i; j++)
{
p = p->next;
} if(!p)
{
return ERROR;
} *e = p->date; return OK; } int LocateElem(LinkList L, elemtype *e)
{
int i = ;
LinkList p;
p = L->next; while(p)
{
i++; if(p->date == *e)
{
return i;
} p = p->next;
} return ;
} int PriorElem(LinkList L, elemtype cur_e, elemtype *pre_e)
{
LinkList p, q; p = L->next; while(p->next)
{
q = p->next; if(q->date == cur_e)
{
*pre_e = p->date; return OK; } p = q;
} return INFEASIBLE;
} int NextElem(LinkList L, elemtype cur_e, elemtype *next_e)
{
LinkList p; //remember it p = L->next; while(p->next)
{ if(p->date == cur_e)
{
*next_e = p->next->date;
return OK;
} p = p->next; } return INFEASIBLE; } int ListInsert(LinkList L, int i, elemtype e)
{
int j = ;
LinkList p = L, s; if(i < )
{
return ERROR;
}
s = (LinkList)malloc(sizeof(struct LNode));
s->date = e;
if(i == )
{
s->next = L; L = s;
}
else
{
while(p && j < i - )
{
p = p->next;
j++;
}
if(!p)
{
return ERROR; }
s->next = p->next;
p->next = s;
}
return OK; } int ListDelete(LinkList L, int i, elemtype *e)
{
int j = ;
LinkList p = L->next;
LinkList q = L; while(j < i)
{
p = p->next;
q = q->next;
j++;
} if(!p || j >= i)
{
return ERROR;
} q->next = p->next;
*e = p->date;
free(p); return OK;
} void ListTraverse(LinkList L)
{
LinkList q = L;
while(q)
{
printf("%d ", q->date);
q = q->next;
} //printf("\n\n");
} #if(0) void main()
{ // 除了几个输出语句外,主程序和main2-1.cpp很像
LinkList L = NULL; // 与main2-1.cpp不同
elemtype e, e0;
int i;
int j, k; InitList(L); for(j=; j<=; j++)
{
i = ListInsert(L, , &j);
} printf("在L的表头依次插入1~5后:L="); ListTraverse(L); // 依次对元素调用print(),输出元素的值 i = ListEmpty(L); printf("L是否空:i=%d(1:是0:否)\n",i); ClearList(L); printf("清空L后:L="); ListTraverse(L);
i = ListEmpty(L); printf("L是否空:i=%d(1:是0:否)\n",i); for(j=; j<=; j++)
{
ListInsert(L, j, &j);
} printf("在L的表尾依次插入1~10后:L="); ListTraverse(L);
GetElem(L, , &e); printf("第5个元素的值为%d\n",e);
for(j=; j<=; j++)
{
k = LocateElem(L, &j);
if(k)
{
printf("第%d个元素的值为%d\n",k,j);
}
else
{
printf("没有值为%d的元素\n",j);
}
}
for(j=;j<=;j++) // 测试头两个数据
{
GetElem(L, j, &e0); // 把第j个数据赋给e0
i = PriorElem(L, e0, &e); // 求e0的前驱
if(i == INFEASIBLE) printf("元素%d无前驱\n", e0);
else
printf("元素%d的前驱为%d\n", e0, e);
}
for(j=ListLength(L)-; j<=ListLength(L); j++) // 最后两个数据
{
GetElem(L, j, &e0); // 把第j个数据赋给e0
i=NextElem(L, e0, &e); // 求e0的后继
if(i == INFEASIBLE)
{
printf("元素%d无后继\n",e0);
}
else
{
printf("元素%d的后继为%d\n", e0, e);
}
}
k = ListLength(L); // k为表长 for(j=k+; j>=k; j--)
{
i = ListDelete(L, j, &e); // 删除第j个数据
if(i == ERROR)
{
printf("删除第%d个元素失败\n",j);
}
else
{
printf("删除第%d个元素成功,其值为%d\n", j, e);
}
}
printf("依次输出L的元素:"); ListTraverse(L);
DestroyList(L); printf("销毁L后:L=%u\n",L);
} #endif void main()
{
LinkList L = NULL;
int i, j;
InitList(L); for(j=; j<=; j++)
{
i = ListInsert(L, , j);
} printf("在L的表头依次插入1~5后:L="); ListTraverse(L); // 依次对元素调用print(),输出元素的值
}
曾经数据结构课练习过的,拿出来分享一下
C语言基础——链表的相关操作的更多相关文章
- 前端基础之jquery_mouse相关操作与不同
jquery中mouse相关操作与不同 mousedown() //当鼠标指针移动到元素上方,并按下鼠标左键时,会发生 mousedown 事件 mouseup() //当鼠标指针移动到元素上方,并松 ...
- Python 基础之集合相关操作与函数和字典相关函数
一:集合相关操作与相关函数 1.集合相关操作(交叉并补) (1)intersection() 交集 set1 = {"one","two","thre ...
- Oracle language types(语言种类) 表的相关操作 DDL数据定义语言
数据定义语言 Data Definition Language Statements(DDL)数据操纵语言 Data Manipulation Language(DML) Statements事务控制 ...
- Java 语言基础之数组常见操作
对数组操作最基本的动作: 存和取 核心思想: 就是对角标的操作 数组常见操作: 1, 遍历 2, 获取最大值和最小值 3, 排序 4, 查找 5, 折半查找 // 1. 遍历 int[] arr = ...
- C语言基础 (12) 文件的操作 FILE
课程回顾 结构体基本操作: 结构体类型的定义 // struct为关键字 Stu为自定义标识符 // struct Stu才是结构体类型 // 结构体成员不能在定义类型时赋值 struct Stu { ...
- C语言基础--数组及相关
概念: 一堆相同类型的数据的有序集合 格式: 元素类型 数组名称[ 元素个数 ] 定义数组: // 定义了一个名称叫做scores的数组, 数组中可以存放3个int类型的数据 ]; // 只要定义一 ...
- 01基础数据类型——list相关操作
#列表的创建#列表是由[]来表示的,将元素放在[]中,如lst=["aa","bb",["cc","dd"," ...
- 2.2 Go语言基础之位运算操作
一.位运算符 位运算符对整数在内存中的二进制位进行操作. 运算符 描述 & 参与运算的两数各对应的二进位相与. (两位均为1才为1) | 参与运算的两数各对应的二进位相或. (两位有一个为1就 ...
- C++实现链表的相关基础操作
链表的相关基础操作 # include <iostream> using namespace std; typedef struct LNode { int data; //结点的数据域 ...
随机推荐
- PHP-Gealman
一.简介 Gearman是一个分发任务的程序框架,它会对作业进行排队自动分配到一系列机器上.gearman跨语言跨平台,很方便的实现异步后台任务.php官方收录:http://php.net/manu ...
- win10下Java环境配置
JAVA_HOME : E:\ensoft\jdk(这个是jdk安装路径) CLASSPATH : .;E:\ensoft\jdk\lib;E:\ensoft\jdk\lib\dt.jar;E:\en ...
- Nginx能干啥?
Nginx能干的事很多,很强大.官方文档详见点我. Nginx的命令行参数 -? | -h 打印帮助信息 -c file 读取指定配置文件,而不是默认的nginx.conf -g directives ...
- C/C++内存泄露检测
以下测试基于的gcc版本: gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4Copyright (C) 2013 Free Software Foundation, In ...
- My SQL 和SQL Server区别
MySQL 与SQL Server区别 今天了解了二者区别,整理网上查阅资料,总结列举如下: MSSQL == SQL server 是sybase与微软合作时期的产物. 对于程序开发人员而言,目前使 ...
- ZT C,C++表达式求值顺序 裘老的解释。 [问题点数:300分]
http://bbs.csdn.net/topics/370153775 [置顶] [推荐] C,C++表达式求值顺序 裘老的解释. [问题点数:300分] 最近这问题有从日经变时经的趋势,这里贴出裘 ...
- 在Windows 10上部署Apache PredictionIO开发环境
Windows在初研究人员的探索下,研究出了一套更为精简的环境配置,极大的缩短了开发时间与效率,在此总结以供后来者参阅. 1.部署环境的配置 Windows10 64 home IntelliJ ID ...
- ZOJ-3286 Very Simple Counting---因子数打表
题目链接: https://cn.vjudge.net/problem/ZOJ-3286 题目大意: f(n)为n的因子个数 求出有多少个f(i)使得f(i) == f(n) && i ...
- MVVM的本质:视图逻辑处理、视图管理、视数中间层
MVVM的核心是将原来Controller中的视图逻辑.视图管理.视数中间层的功能剥离出来,形成单独的模块: 大部分功能与视图相关.少部分与数据相关: 视图逻辑和业务逻辑不通: 解决的问题:UIVie ...
- PHP-------文件上传的实例
文件上传的实例 一.上传头像 在注册时,要求用户上传头像,登陆主页面,显示用户信息时,头像也要显示出来. 例子: 注册页面: 图片存数据库时是text类型. <title>无标题文档< ...