【复习数据结构】单链表的操作

#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct LNode{	//定义单链表结点类型
	ElemType data;		//数据域
	struct LNode *next;	//指针域
}LNode,*LinkList;

/**
*	头插法初始化链表
**/
LinkList CreateListhead(void){
	char ch;
	LinkList L;		//初始化链表
	LNode *p;			//用来存放当前申请结点
	L=NULL;
	ch=getchar();
	while(ch!=‘\n‘){
		p=(LNode*)malloc(sizeof(LNode));
		p->data=ch;
		p->next=L;
		L=p;
		ch=getchar();
	}
	return L;		//返回的是链表
}
/**
*	尾插法初始化链表
**/
LinkList CreateListTail(void){
	char ch;
	LinkList L;
	LNode *p,*r;		//r为尾指针
	L=NULL;
	r=NULL;
	ch=getchar();
	while(ch!=‘\n‘){
		p=(LNode*)malloc(sizeof(LNode));
		p->data=ch;
		if(L==NULL){	//L为空插入第一个结点
			L=p;
		}else{
			r->next=p;	//1 先把p接上,接到r所指向结点的后面
		}
		r=p;			//2 再把尾指针指向p,方便插入下一个结点
		if(r!=NULL){
			r->next=NULL;
		}
		ch=getchar();
	}
	return L;
}
/**
*	根据位置获取元素
**/
LNode *GetElem(LinkList L,int i){
	int j=1;			//计数
	LNode *p=L;			//p指向的就是第一个结点
	while(p->next&&j<i){		//这里判断p和判断p->next的作用
		p=p->next;
		j++;
	}
	if(i==j){
		printf("%c\n",p->data);
		return p;
	}else{
		return NULL;
	}
}
/**
*	根据值获取元素
**/
LNode *LocateElem(LinkList L,ElemType e){
	LNode *p=L->next;
	while(p!=NULL&&p->data!=e){
		p=p->next;
	}
	printf("%c\n",p->data);
	return p;
}

/**
*	链表的插入实现方法之一:尾插法
**/
void InsertNode(LinkList L,ElemType e,int index){
	int j=1;
	LNode *p=L,*newnode;		//p指针遍历当前结点,newnode用于存放新结点
	while(p->next&&j<index){
	p=p->next;
	j++;
	}

	newnode=(LNode*)malloc(sizeof(LNode));
	newnode->data=e;
	p->next=newnode;
	p=newnode;

}
/**
*	根据索引删除结点
**/
void DeleteNode(LinkList L,int index){
	int j=1;
	LNode *p=L,*temp;	//临时指针用来存放删除结点
	while(p->next&&j<index-1){
		p=p->next;
		j++;
	}
	if(j==index-1){
		//删除当前p所指向结点的下一个结点
		temp=p->next;
		p->next=temp->next;
		free(temp);

	}
}

/**
*	合并单链表 直接将一个list链接到另一个表表尾
**/
LNode Concatenate(LinkList A,LinkList B){
	LNode *temp;
	if(A == NULL){
		return B;
	}else{
		if(B != NULL){
			for(temp = A; temp->next; temp = temp->next);//遍历到链表A的末尾
			temp->next = B;
		}
	}
}
/**
*	合并两个从小到大的有序单链表 并将链表中data域仍按照从小到大顺序排列
*	非递归
**/
LNode ConcatenateOrderByData(LinkList A,LinkList B){
	LinkList mergeList = NULL;
	LNode *curLastNode = NULL;
	LNode *p1=A;
	LNode *p2=B;
	if(A == NULL){
		return B;
	}
	if(B == NULL){
		return A;
	}
	if(A->data < B->data){
		mergeList = A;
	}else{
		mergeList = B;
	}
	while(A != NULL && B != NULL){
		if(A->data < B->data){
		//先链入A结点
			curLastNode->next = A;
			curLast = A;
			A = a->next;
		}else{//先链入B结点
			curLastNode->next = B;
			curLast = B;
			B = B->next;
		}
	}
	//经过上面的while循环之后,如果A或B仍然不为空,说明有另外一方已经为空了
	//直接将剩下的链表链入即可
	if(A != NULL){
		curLastNode->next = A;
	}
	if(B != NULL){
		curLastNode->next = B;
	}
}
void main(){

}

  

时间: 2024-10-12 09:52:20

【复习数据结构】单链表的操作的相关文章

数据结构——单链表及其操作

1 #include<iostream> 2 #include<string> 3 #include<stdlib.h> 4 5 using namespace std; 6 7 typedef int ElemType; 8 typedef int Status; 9 #define OK 1 10 #define ERROR 0 11 12 13 //单链表的存储结构 14 typedef struct LNode 15 { 16 ElemType data; //

java数据结构:单链表常见操作代码实现

一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashMap等集合的底层结构都是链表结构.链表以结点作为存储单元,这些存储单元可以是不连续的.每个结点由两部分组成:存储的数值+前序结点和后序结点的指针.即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作. 单链表结构: Java中单链表采用No

数据结构——单链表

1.对于一个有数据的单链表,如果要对其初始化,使用下列操作: 1 void initList(sqlist &L){ #对于需要改变的变量或链表,使用引用型 2 L.length==0; 3 } //单链表长度重置为0 2.单链表有4中操作:归并,插入,删除,查找 归并的实现:(链表A,B是有序的,且归并后的C也是有序的)如下: 1 void merge(LNode *A,LNode *B,LNode *&C){ //将A B两个链表归并为一个新的单链表(链表C采用引用型) 2 LNode

数据结构之链表单向操作总结

链表是数据结构的基础内容之一,下面就链表操作中的创建链表.打印链表.求取链表长度.判断链表是否为空.查找结点.插入结点.删除结点.逆转链表.连接链表.链表结点排序等进行总结. 1.创建表示结点的类,因为链表操作中需要比较结点,因此结点需要实现comparable接口. public class Node implements Comparable<Node> { private Object data; private Node next; //构造函数 public Node() { thi

python实现数据结构单链表

#python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" def __init__(self, elem): self.elem = elem self.next = None # 节点一开始初始化的时候并不知道下一个元素的地址,所以先设置为空 class SingLinkList(object): """单链表""

数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个). 输入 第一行输入元素个数n: 第二行输入n个整数. 输出 第一行输出初始链表元素个数: 第二行输出按照逆位序所建立的初始链表: 第三行输出删除重复元素后的单链表元素个数: 第四行输出删除重复元素后的单链表. 示例输入 10 21 30 14 55 32 63

算法数据结构 单链表的实现+操作 以及和顺序表的对比

顺序表和单链表的优缺点对比: 顺序表的优点,无需为表示表中元素之间的逻辑关系而增加额外的存储空间: 可以快速的存取表中的任意位置的元素. 顺序表的缺点,插入后删除操作需要移动大量元素: 当线性表长度不稳定时,存储空间难确定,容易造成存储空间碎片. 对于单链表 链式存储即元素存储的内存单元可以是不连续,分散的.对于元素间如何来维护他们的关系(即逻辑结构,每个元素的前驱和后继.) 即用到一个指针域来存储他和前驱或是后继直接的关系. 如上面的是一个单链表的指针结构,即每个元素中存储了他的后继元素的内存

C# 数据结构 - 单链表 双链表 环形链表

链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一个节点一个节点去访问,这样所花的时候就比较多了.(顺序表可以弥补这缺点,但插入和删除就非常耗性能) 单链表 单链表的构成:必须要有一个链表头(head),每个节点里面有一个Next用于指向下一个节点(类似于指针).最后一个节点的Next为null来标识链表的尾. 如下图 代码实现 1 /* ----

数据结构单链表实现

<数据结构>中单链表的实现c代码 转自:http://blog.chinaunix.net/uid-22750250-id-1769905.html include.h /******************************************************************      程序中要用的头文件******************************************************************/ #include<st