链表的操作

// xuanze-sort.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#define MAXSIZE 100 //定义线性表的最大长度
#include "stdio.h"
#include <stdlib.h>
#include "string.h"

typedef int elemType ;

/************************************************************************/
/* 以下是关于线性表链接存储(单链表)操作的18种算法 */

/* 1.初始化线性表,即置单链表的表头指针为空 */
/* 2.创建线性表,此函数输入负数终止读取数据*/
/* 3.打印链表,链表的遍历*/
/* 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
/* 5.返回单链表的长度 */
/* 6.检查单链表是否为空,若为空则返回1,否则返回0 */
/* 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */
/* 8.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
/* 9.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
/* 10.向单链表的表头插入一个元素 */
/* 11.向单链表的末尾添加一个元素 */
/* 12.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */
/* 13.向有序单链表中插入元素x结点,使得插入后仍然有序 */
/* 14.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
/* 15.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */
/* 16.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */
/* 17.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */
/* 18.交换2个元素的位置 */
/* 19.将线性表进行快速排序 */

/************************************************************************/
typedef struct Node{ /* 定义单链表结点类型 */
elemType element;
Node *next;//链表的指针域
}Node;

/* 11.向单链表的末尾添加一个元素,成功插入返回1 */
int insertLastList(Node *pHead,elemType insertElem)
{
Node *pNode = pHead;
Node* pInsert = (Node *)malloc(sizeof(Node)); //申请一个新节点

pInsert->element = insertElem;//插入的数据
pInsert->next = NULL;//链表尾端
if(pNode->next==NULL)
{
pNode->next = pInsert;
}
else
{
pNode = pNode->next;
while(pNode->next != NULL)
{
pNode = pNode->next;
}
pNode->next = pInsert;
}
printf("insertLastList函数执行,向表尾插入元素成功\n");
return 1;
}
/* 1.初始化线性表,即置单链表的表头指针为空 */
Node* initList()
{
Node* pNode=(Node*)malloc(sizeof(Node));
if (pNode!=NULL)
{
printf("initList函数执行,初始化成功\n");
pNode->next = NULL;
return pNode;
}
else
printf("initList函数执行,初始化失败\n");
return NULL;
}
/*2、向链表中插入数据*/
void creatList(Node *pHead)
{
//Node* temp;
Node* pNode = pHead;
while(1)
{
elemType data;
printf("请输入数据,输出为0时退出!\n");
scanf_s("%d",&data);
if (data == 0)
break;
else
int x = insertLastList(pHead, data);
}

}

/* 3.打印链表,链表的遍历,头链表没有数据元素,链表末没有指针地址*/
void printList(Node *pHead)
{
if( pHead->next == NULL) //链表为空
{
printf("PrintList函数执行,链表为空\n");
}
else
{
while(NULL != pHead->next)
{
pHead = pHead->next;
printf("%d ",pHead->element);
}
printf("\n");
}
}

/* 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
void clearList(Node *pHead)
{
Node* pNode = pHead;
Node* pTemp;
if(pNode->element==NULL)
{
printf("空链表\n");
}
else
{

pNode = pNode->next;
while(pNode->next!=NULL)
{
pTemp = pNode;//保存当前节点
pNode = pNode->next;//指向下一个节点
free(pTemp);
}
free(pNode);
pHead->next = NULL;
printf("清除链表中元素成功,返回一个空链表\n");

}
}

/* 5.返回单链表的长度 */
int sizeList(Node *pHead)
{
Node* pNode = pHead;
int size = 0;

while(pNode->next != NULL)
{
size++; //遍历链表size大小比链表的实际长度小1
pNode = pNode->next;
}
printf("sizeList函数执行,链表长度 %d \n",size);
return size; //链表的实际长度
}

/* 6.检查单链表是否为空,若为空则返回1,否则返回0 */
int isEmptyList(Node *pHead)
{
if(pHead->next == NULL)
{
printf("isEmptyList函数执行,链表为空\n");
return 1;
}
printf("isEmptyList函数执行,链表非空\n");

return 0;
}

/* 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */
elemType getElement(Node *pHead, int pos)
{
int i=0;
Node* pNode = pHead;

if(pos < 1)
{
printf("getElement函数执行,pos值非法\n");
return 0;
}
if(pNode->next == NULL)
{
printf("getElement函数执行,链表为空\n");
return 0;
//exit(1);
}
while(pNode->next != NULL)
{
pNode=pNode->next;
++i;
if(i == pos)
{
return pNode->element;
}
if(i>=pos)
{
printf("error(有错误)!\n");
return -1;
}

}
if(i>=pos)
{
printf("error(溢出)!\n");
return 0;
}
else
return 1;

}

/* 8.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
elemType *getElemAddr(Node *pHead, elemType x)
{
Node* pNode;
pNode = pHead;
if(NULL == pNode->next)
{
printf("getElemAddr函数执行,链表为空\n");
return NULL;
}
if(x < 0)
{
printf("getElemAddr函数执行,给定值X不合法\n");
return NULL;
}
pNode=pNode->next;

while((pNode->element != x) && ( pNode->next!=NULL)) //判断是否到链表末尾,以及是否存在所要找的元素
{
pNode = pNode->next;
}
if((pNode->element != x) )
{
printf("getElemAddr函数执行,在链表中未找到x值\n");
return NULL;
}
else
return &(pNode->element);

}

/* 9.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
int modifyElem(Node *pHead,int pos,elemType x)
{
Node *pNode = pHead;
int i = 0;
if(pNode->next==NULL)
{
printf("modifyElem函数执行,链表为空\n");
return 0;
}
if(pos < 1)
{
printf("modifyElem函数执行,pos值非法\n");
return 0;
}

while(pNode->next !=NULL )//存在下一个节点
{
pNode = pNode->next;//指向下一个节点
++i;
if(i == pos)
{
pNode->element = x;
return 1;
}
}
if(i < pos) //链表长度不足则退出
{
printf("modifyElem函数执行,pos值超出链表长度\n");
return 0;
}

}

/* 10.向单链表的表头插入一个元素 */
int insertHeadList(Node *pNode,elemType insertElem)
{
Node *pInsert;
pInsert = (Node *)malloc(sizeof(Node));//为分配的新节点分配内存
pInsert->element = insertElem;
pInsert->next = pNode->next;
pNode->next = pInsert;

printf("insertHeadList函数执行,向表头插入元素成功\n");

return 1;
}

/* 11、找出链表中的倒数第k个元素的值 */
elemType findList(Node* pHead,int k)
{
int i ;
Node* pNode1 = pHead;
Node* pNode2 = pHead;
for(i=0;i<k;i++)
{
pNode2 = pNode2->next; //遇到
}
while(pNode2->next!=NULL)
{
i++;
pNode1=pNode1->next;
pNode2 = pNode2->next;
}
return pNode1->next->element;

}

/* 12、实现单链表反转*/
void reverseNode(Node* pHead)
{
Node* pNode1=pHead;
Node* pNode2 = pHead;

if(pNode1->next!=NULL)
{
pNode2->next = NULL;
pNode2->element = pHead->next->element;//pNode2为最后一个节点
pNode1 = pNode2;
while(pNode1->next!=NULL)
{
pNode1 = pNode1->next;//指向下一个节点

}
}
else
{
printf("空链表\n");
}

}

/* 12.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */

/* 13.向有序单链表中插入元素x结点,使得插入后仍然有序 */
/* 14.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
/* 15.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */
/* 16.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */
/* 17.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */
/* 18.交换2个元素的位置 */
/* 19.将线性表进行快速排序 */

/******************************************************************/
int main(int argc, char* argv[])
{
Node *pList=NULL;
int length = 0;

int result =0;

pList = initList(); //链表初始化,就是给结构体指针动态分配内存,且plist->next=NULL;
//遍历链表,打印链表

result = insertLastList(pList,10); //表尾插入元素10
printList(pList);
result = insertLastList(pList,11); //表尾插入元素11
printList(pList);
result = insertLastList(pList,12); //表尾插入元素12
printList(pList);
result = insertLastList(pList,13); //表尾插入元素13
printList(pList);
creatList(pList);//插入元素,输入为0时的时候返回
printList(pList);
result = insertHeadList(pList,0);//表头插入元素
printList(pList);
result = modifyElem(pList,1,-1);//链表第一个数字改为-1
printf("返回链表中的数为11的地址%p\n",getElemAddr(pList, 10));//返回链表中的数为11的地址
printf("链表的长度为:%d\n",sizeList(pList));//返回链表的长度
clearList(pList);
printf("链表的长度为:%d\n",sizeList(pList));//返回链表的长度

return 0;
}
//ABD##E##CF##G##

时间: 2024-11-07 01:06:03

链表的操作的相关文章

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

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

链表 其他操作

1 实验4 链表其它操作 2 实验目的 3 1.熟悉对单链表的一些其它操作. 4 2.掌握循环链表和双链表的一些操作,理解与单链表操作的不同. 5 实验内容 6 程序1 7 设单链表L是一个非递减有序表,写一算法将x插入其中后仍保持L的有序性. 8 设计要求:在程序中构造三个子程序分别为 9 LinkedList LinkedListCreat( ) /*建立链表*/ 10 void InsertList(LinkedList L,int x) /*插入结点*/ 11 void print(Li

C语言之----面向对象的方法实现链表的操作

1 /* 2 * 详细运行过程: 本程序实现的是对链表的简单的操作,即链表的增 删 改 查 销毁 初始化 3 * 运用面向对象的思想,实现一个类op,op中包括了所有的链表操作方法 4 * 其他的程序调用op类,实现对表链表的操作 5 * 链表包括 6 * 面向对象,简单易学程序更加紧凑,更加健壮,更安全 7 */ 8 #include<string.h> 9 #include<stdlib.h> 10 #include<stdio.h> 11 12 #define o

关于c语言链表的操作

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

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

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

深入浅出数据结构C语言版(5)——链表的操作

上一次我们从什么是表一直讲到了链表该怎么实现的想法上:http://www.cnblogs.com/mm93/p/6574912.html 而这一次我们就要实现所说的承诺,即实现链表应有的操作(至于游标数组--我决定还是给它单独写个博文比较好~). 那么,我们的过程应该是怎么样的呢?首先当然是分析需要什么操作,然后再逐一思考该如何实现,最后再以代码的形式写出来. 不难发现,我们希望链表能支持的(基础,可以由此延伸)操作就是: 1.给出第n个元素 2.在第n个元素的后面插入一个元素(包含在最后一个

链表各类操作详解

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

数据结构链表的操作集合(建立,遍历,插入,删除,排序,长度,空判断等)

#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct Node { int data;//数据域 struct Node * pNext;//指针域 }NODE, * PNODE; //NODE等价于struct Node,  PNODE 等价于struct Node * //函数声明 void create_list(PNODE pHead);//创建一个动态链表 void tra

基于单链表的操作

单链表 功能设计 1从首元结点开始输出数据域即p->data直到p->next=NULL.typedef struct Node 定义一个链式存储的单链表Node *为结构体指针类型例如对于单链表Lp=L-〉next通过p->data 访问该元素的数据值. 2creatlist(linklist *H) 从空表开始每次读入数据生成新结点将读入的数据存放到新结点的数据域中然后将新结点插入到当前链表的表头结点之后直至读入结束位置为止. 3Leng(linklist *H ) 在单链表中整个链