C语言链表完整实现

#include <stdio.h>
#include <stdlib.h>

#define ElementType int
typedef struct Node *List;
typedef struct Node{
	ElementType Data;
	List Next;
};
int Length(List PtrL);
List FindKth(int K,List PtrL);
List Find(ElementType X,List PtrL);
bool Insert(ElementType X,int i, List &PtrL);
List Delete(int i,List &PtrL);
void InitList(List PtrL){
	PtrL= (List)malloc(sizeof(struct Node));
	PtrL->Next=NULL;
}
void printL(List PtrL){
	printf("-------------------------------------------------------------------\n");
	List TmpList = PtrL;
	while(TmpList){
		printf("%d\n",TmpList->Data);
		TmpList = TmpList->Next;
	}
}

int main(){
	List PtrL;
	InitList(PtrL);
	Insert(10,1,PtrL);
	printL(PtrL);
	Insert(20,2,PtrL);
	printL(PtrL);
	for(int i = 1;i<10;i++)
		Insert(i,i,PtrL);
	printL(PtrL);

	for(int i = 1;i<5;i++)
		Delete(i,PtrL);
	Delete(5,PtrL);
	printL(PtrL);
	return 0;
}
int Length(List PtrL){
	List TmpPtrL = PtrL;
	int i = 0;
	while(TmpPtrL){
		TmpPtrL = TmpPtrL->Next;
		i++;
	}
	return i;
}
List  FindKth( int K, List PtrL )
{      List  p = PtrL;
        int  i = 1;
        while (p !=NULL && i < K ) {
               p = p->Next;
               i++;
        }
       if ( i == K ) return p;
/* 找到第K个,返回指针 */
       else  return NULL;
 /* 否则返回空 */
}
List Find(ElementType X,List L){
	List TmpList = L;
	while(TmpList->Data!=X&&TmpList)
		TmpList = TmpList->Next;
	return TmpList;//不管是不是空,就是这一个
}

bool Insert(ElementType X,int i, List &PtrL){
	//如果插入节点到头部
	List s,p;
	if(i==1){
		s = (List)malloc(sizeof(struct Node));
		s->Data=X;
		s->Next=PtrL;
		PtrL=s;
		//printf("%d",PtrL->Data);
		return true;
	}
	p = FindKth(i-1,PtrL);
	if(p==NULL){
		printf("插入位置不合适\n");
		return false;
	}else{
		s = (List)malloc(sizeof(struct Node));
		s->Data=X;
		s->Next=p->Next;
		p->Next=s;
		return true;
	}
}

List Delete(int i,List &PtrL){
	//如果删除头结点
	List s,p;
	if(i==1){
		s = PtrL;
		PtrL = PtrL->Next;
		free(s);
		return PtrL;
	}
	p = FindKth(i-1,PtrL);
	if(p==NULL){
		printf("第i-1个节点不存在\n");
		return NULL;
	}else if(p->Next==NULL){
		printf("第i个节点不存在\n");
		return NULL;
	}else{
		s = p->Next;
		p->Next=s->Next;
		free(s);
		return PtrL;
	}
}

  

时间: 2024-10-25 16:33:27

C语言链表完整实现的相关文章

C语言-链表

单向链表:结构体非常适合链表结构,链表的组成:head指针.数据块节点指针p->nest.结束指针NULL. 链表操作:需要首先找到表头head指针.链表的操作包括动态链表的创建.顺序输出.删除节点.插入节点的操作. 动态存储操作函数:(ANSI规则返回的指针类型为void*,早期的为字符型指针) 分配一个块:void *malloc(unsigned int size)  //分配成功则返回指向起始地址的指针void * 分配多个块:void *calloc(unsigned n,unsign

关于c语言链表的操作

这几天又讲到链表了,但是又忘记了,所以重新把关于链表的建链表,对链表进行排序,然后是删除,插入,以及遍历等功能..但是最近要考试了,所以没有写成菜单的形式..等考试完了,在进行补充吧.. 代码如下... #include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int data; struct node *next; }; int main() { /*建立链表操作*/ int n,x,p

C语言链表实例--玩转链表

下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 name,性别 sex 和成绩 score 等.另一个域为指针域,存放下一结点的首地址.链表中的每一个结点都是同一种结构类型. 指针域: 即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域. 在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域

c语言链表和指针的运用

在学习指针之前,首先要认识指针.指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针. 根据出现的位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针的取值.当用在声明一个变量时,*表示这里声明了一个指针.其它情况用到*表示指针的取值.&是地址操作符,用来引用一个内存地址.通过在变量名字前使用&操作符,我们可以得到该变量的内存地址.

C语言链表的来源分析

C语言中的链表是重点,也是难点,而且意义非凡.对链表的的抽象和恐惧是源于对它的来龙去脉的不明白.所以很有必要对它的发展渊源做透彻分析. 链表的单位是节点,而节点源于复合数据类型:结构体: 节点和结构体的区别就是看是否有指针域,目的就是想找到下一个节点: 结构体形如: struct Ghost { char name[30]; int age; int height; char addr[30]; }; 节点形如: struct Ghost { char name[30]; int age; in

C语言链表各类操作详解

链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个“头指针”变量,以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址.因此,head指向第一个元素:第一个元素又指向第二个元素:……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束.        链表的各类操

注释最全的C语言链表的增删改查

1 //这是C语言的写法,但会报错,原因是len(当前的节点长度) 2 //无法在insert(插入)和deleted(删除)之后改变 3 //不能使用delete是因为delete是C++中的一个运算符 4 //最终我把改程序用C++写了一遍,运用引用将len的真实值改变了 5 #include <stdio.h> 6 #include <stdlib.h> 7 typedef int ElementType; 8 typedef struct node { 9 ElementT

图论——图的邻接表实现——Java语言(完整demo)

1.图的简单实现方法--邻接矩阵 表示图的一种简单的方法是使用一个一维数组和一个二维数组,称为领接矩阵(adjacent matrix)表示法. 对于每条边(u,v),置A[u,v]等于true:否则,数组的元素就是false.如果边有一个权,那么可以置A[u][v]等于该权,而使用一个很大或者很小的权来标记不存在的边.虽然这样表示非常简单,但是,它的空间需求则为θ(|V|2),如果图的边不是很多,那么这种表示的代价就太大了.若图是稠密(dense)的:|E|=θ(|V|2),则领接矩阵是合适的

玩转C语言链表

链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个“头指针”变量,以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址.因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束. 链表的各类操作包括:学习单