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; //结点的数据域 ...
随机推荐
- xml布局显示需要预判断,可是还没有show出来,怎么办?
最近在实际工作中遇到了一种情况,写一个音量条,音量条显示出来之前要判断系统的音量大小,然后给音量条设置显示的位置.解决办法有两种, 第一种: m_pHostThread>MsgAsyncC ...
- Mysql学习---基础操作学习
1.1. 基本操作 数据库引擎 Inodb:支持事务[原子性操作,完成一些列操作后才算完成操作,否则rollback] MyISAM: 支持全文索引,强调了快速读取操作,主要用于高负载的select ...
- C#内存复制结构
C++中定义结构如下,需要转化成C#的结构 typedef struct tagNET_DVR_CID_ALARM{ DWORD dwSize; BYTE sCIDCode[CID_COD ...
- AWK入门指南
一. AWK入门指南 Awk是一种便于使用且表达能力强的程序设计语言,可应用于各种计算和数据处理任务.本章是个入门指南,让你能够尽快地开始编写你自己的程序.第二章将描述整个语言,而剩下的章节将向你展示 ...
- (转)tcp的半连接与完全连接队列
队列及参数 tcp-sync-queue-and-accept-queue-small.jpg server端的半连接队列(syn队列) 在三次握手协议中,服务器维护一个半连接队列,该队列为每个客 ...
- Mybatis批量插入及传参问题
先看需求:将报文对象Message批量插入分库分表的Oracle数据库中 一般如果直接传入List的话,需要加上parameterType="java.util.List" ,然后 ...
- Entity Framework——读写分离
1 实现 CustomDbContext扩展了DbContext,其构造函数带有形式参nameOrConnectionString,可以在使用CustomDbContext时指定数据库连接字符串. D ...
- PAT——1011. A+B和C
给定区间[-231, 231]内的3个整数A.B和C,请判断A+B是否大于C. 输入格式: 输入第1行给出正整数T(<=10),是测试用例的个数.随后给出T组测试用例,每组占一行,顺序给出A.B ...
- 【洛谷P2340】 奶牛会展
\(奶牛会展\) 题目链接 由于智商之和或情商之和不能为负数,所以直接把智商+情商>0的奶牛加上是布星的 我们考虑背包,不妨将智商当做物品大小,将情商当做价值 我们要求 大小+价值 的最大值 \ ...
- ffmpeg 从mp4上提取H264的nalu
转自http://blog.csdn.net/gavinr/article/details/7183499 1.获取数据 ffmpeg读取mp4中的H264数据,并不能直接得到NALU,文件中也没有储 ...