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语言基础——链表的相关操作的更多相关文章

  1. 前端基础之jquery_mouse相关操作与不同

    jquery中mouse相关操作与不同 mousedown() //当鼠标指针移动到元素上方,并按下鼠标左键时,会发生 mousedown 事件 mouseup() //当鼠标指针移动到元素上方,并松 ...

  2. Python 基础之集合相关操作与函数和字典相关函数

    一:集合相关操作与相关函数 1.集合相关操作(交叉并补) (1)intersection() 交集 set1 = {"one","two","thre ...

  3. Oracle language types(语言种类) 表的相关操作 DDL数据定义语言

    数据定义语言 Data Definition Language Statements(DDL)数据操纵语言 Data Manipulation Language(DML) Statements事务控制 ...

  4. Java 语言基础之数组常见操作

    对数组操作最基本的动作: 存和取 核心思想: 就是对角标的操作 数组常见操作: 1, 遍历 2, 获取最大值和最小值 3, 排序 4, 查找 5, 折半查找 // 1. 遍历 int[] arr = ...

  5. C语言基础 (12) 文件的操作 FILE

    课程回顾 结构体基本操作: 结构体类型的定义 // struct为关键字 Stu为自定义标识符 // struct Stu才是结构体类型 // 结构体成员不能在定义类型时赋值 struct Stu { ...

  6. C语言基础--数组及相关

    概念: 一堆相同类型的数据的有序集合 格式: 元素类型  数组名称[ 元素个数 ] 定义数组: // 定义了一个名称叫做scores的数组, 数组中可以存放3个int类型的数据 ]; // 只要定义一 ...

  7. 01基础数据类型——list相关操作

    #列表的创建#列表是由[]来表示的,将元素放在[]中,如lst=["aa","bb",["cc","dd"," ...

  8. 2.2 Go语言基础之位运算操作

    一.位运算符 位运算符对整数在内存中的二进制位进行操作. 运算符 描述 & 参与运算的两数各对应的二进位相与. (两位均为1才为1) | 参与运算的两数各对应的二进位相或. (两位有一个为1就 ...

  9. C++实现链表的相关基础操作

    链表的相关基础操作 # include <iostream> using namespace std; typedef struct LNode { int data; //结点的数据域 ...

随机推荐

  1. Hyperledger Fabric 1.0 学习搭建 (五)--- 启动Fabric多节点集群

    5.1.启动orderer节点服务 上述操作完成后,此时各节点的compose配置文件及证书验证目录都已经准备完成,可以开始尝试启动多机Fabric集群. 首先启动orderer节点,切换至order ...

  2. 奇葩拿shell + 提权wind08r2奇葩拿shell + 提权wind08r2戏

    0x01 小隐拿站篇 某省还是市级还是县级的空防部 先来刺探目录,拿起御剑, 啪啪啪  (鼓掌)后台出来了   试试弱口令 擦  需要管理员验证码,这个咋玩????这个注入都不用找了,就算注射出账号密 ...

  3. Django 数据模型的字段列表整理

    一个模型最重要也是唯一必需的部分,是它定义的数据库字段. 字段名称限制: 1.一个字段名不能是一个Python保留字,因为那样会导致一个Python语法错误. 2.一个字段名不能包含连续的一个以上的下 ...

  4. mac git 命令自动补全

    步骤如下: 1.下载Git-completion.bash 或者直接使用SourceTree去clone到本地. 下载地址:https://github.com/markgandolfo/git-ba ...

  5. STL - next_permutation 全排列函数

    学习: http://blog.sina.com.cn/s/blog_9f7ea4390101101u.html http://blog.csdn.net/ac_gibson/article/deta ...

  6. Coursera 机器学习基石 第4讲 学习的可行性

    这一节讲述的是机器学习的核心.根本性问题——学习的可行性.学过机器学习的我们都知道,要衡量一个机器学习算法是否具有学习能力,看的不是这个模型在已有的训练数据集上的表现如何,而是这个模型在训练数据外的数 ...

  7. 两种方式(xml+代码)构建SqlSessionFactory+完整实现

    首先创建类.接口.数据库: entity包下Admin类: package com.wbg.springJavaConfig.entity; public class Admin { private ...

  8. Gradle Goodness: Changing Name of Default Build File

    Gradle uses the name build.gradle as the default name for a build file. If we write our build code i ...

  9. Node.js笔记07——不使用generator自定义一个项目,深入了解项目结构

    一.初始化项目 新建项目 git init manager 新建view文件夹,建几个静态文件夹 新建app.js 快速初始化项目依赖 npm init -y 安装express npm instal ...

  10. 课时18.h标签和p标签以及hr标签(掌握)

    如何在webstorm中利用快捷键创建一个新的html的文件? 同时按下键盘上的ctrl+alt+insert(windows) 同时按下键盘上的ctrl+alt+n(os) h标签系列(header ...