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. February 4 2017 Week 5 Saturday

    It takes a great man to be a good listener. 懂得倾听的人才是真的了不起. Don't make comments before you have learn ...

  2. 经典优秀屏幕截图录像工具FastStone Capture推荐

    FastStone Capture (FSCapture) 是经典好用的屏幕截图软件,还具有图像编辑和屏幕录制两大功能. FastStone Capture 主要功能 包括:1.截图功能(可以捕捉:活 ...

  3. mangodb驱动编译

    1.Installing the MongoDB C Driver (libmongoc) and BSON library (libbson) Building on Windows with Vi ...

  4. Linux 系统查看tomcat控制台命令

    前提进入tomcat/logs文件夹下 查看全部命令是:tail -f catalina.out 如果想查看具体文件的日志进入该文件所在目录然后命令如下: tail -f filename

  5. Codeforces Round #435 (Div. 2)【A、B、C、D】

    //在我对着D题发呆的时候,柴神秒掉了D题并说:这个D感觉比C题简单呀!,,我:[哭.jpg](逃 Codeforces Round #435 (Div. 2) codeforces 862 A. M ...

  6. 在WAS下找不到主机名称的问题

    发生错误: 联合 ADMU0036E: Deployment Manager 不能根据名称主机 cdzfwas2 在地址 127.0.0.1 查找           期间发生错误:正在回滚到原始配置 ...

  7. luogu P1642 规划

    嘟嘟嘟 看到最后让求一个比值,应该得往01规划上去想.令x = ∑v[i] / ∑c[i],则x * ∑c[i] = ∑v[i], ∑(v[i] - x * c[i]) = 0. 于是可以二分x(注意 ...

  8. 洛谷p1064 金明的预算方法

    有附带条件的01背包 要那附件必须拿主件 因为一个主件最多有两个附件,所以每次遇到主件可能有四种选择 1.只拿主件 2.拿主件和一号附件 3.拿主件和二号附件 4.都拿 #include <cs ...

  9. FactoryBean的实现原理与作用

    FactoryBean与BeanFactory: 这俩货在拼写上很是相似,很多同学在看IOC源码或者其他地方并不能分清有啥区别,前面的IOC源码中我简单说过,现在统一简单来讲一下: FactoryBe ...

  10. VC MFC工具栏(CToolBar)控件(转)

    工具栏 工具栏控件在控件面板里没有对应的选项(图标),但有一个工具栏控件类CToolBar,所以我们如果要创建一个工具栏控件并显示在窗口里的话,只能用代码来完成,事实上任何一种控件,都可以用代码创建, ...