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

#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 traverse_list(PNODE pHead);//输出链表

bool is_empty(PNODE pHead);//判断链表非空

void length_list(PNODE pHead);//求链表长度

void insert_list(PNODE pHead);//插入结点

void delete_list(PNODE pHead);//删除结点

void sort_list(PNODE pHead);//链表元素排序

void play_choose(void);//显示菜单栏

int main()

{

int i;

PNODE pHead;

pHead=(PNODE)malloc(sizeof(NODE));

if(pHead==NULL)

{

printf("动态内存分配失败!");

exit(-1);

}

play_choose();

while(true)

{

printf("\n\t\t请选择你要执行的操作:");

scanf("%d",&i);

switch(i)

{

case 1:
create_list(pHead);break;

case 2:
traverse_list(pHead);break;

case 3:
insert_list(pHead);break;

case 4:
delete_list(pHead);break;

case 5:
sort_list(pHead);break;

case 6: play_choose();printf("\t\t\t\t处理后的链表:\n");traverse_list(pHead);break;

case 7: length_list(pHead);break;

case 8:
exit(-1);

default:

printf("您输入的是非法值\n\n");

break;

}

}

return 0;

}

void play_choose(void)

{

system("cls");

printf("\n\n\n\t\t.......................................\n\n\n");

printf("\t\t      1-建立链表      2-遍历链表               \n\n");

printf("\t\t      3-插入元素      4-删除元素               \n\n");

printf("\t\t      5-排序元素      6-清屏(只显示菜单)       \n\n");

printf("\t\t      7-链表长度      8-退出                  \n\n");

printf("\n\n\t\t.......................................  \n\n\n");

}

void create_list(PNODE pHead)

{

int len ;//用来存放有效结点的个数

int i;

int val;//用来临时存放用户输入的节点的值

PNODE pNew;

PNODE pTail=pHead;//pTail始终指向尾节点,链表空时pTial指向尾结点即和pHead都指向头结点,

printf("请输入您需要生成链表的节点的个数:len=");

scanf("%d",&len);

for( i=0;i<len;++i)

{

printf("请输入第%d的值",i+1);

scanf("%d",&val);

pNew = (PNODE)malloc(sizeof(NODE));

if(NULL==pNew)

{

printf("分配失败,程序终止\n");

exit(-1);

}

//pNew->date=val;

//pHead->pNext=pNew;

//pNew->pNext=NULL;

pNew->data=val;

pTail->pNext=pNew;

//pNew->pNext=NULL;

pTail=pNew;

}

pTail->pNext=NULL;

return;

}

void traverse_list(PNODE pHead)

{

if(is_empty(pHead)==true)

{

printf("链表为空\n");

return;

}

printf("\t\t\t\t");

PNODE  p=pHead->pNext;

while(p!=NULL)

{

printf("%d   ",p->data);

p=p->pNext;

}

printf("\n");

return;

}

bool is_empty(PNODE pHead)

{

if(pHead->pNext==NULL)

{

return true;

}

else

{

return false;

}

}

void length_list(PNODE pHead)

{

int len=0;

PNODE p=pHead->pNext;

while(p!=NULL)

{

len++;

p=p->pNext;

}

printf("链表长度是%d\n",len);

return;

}

void insert_list(PNODE pHead)

{

//在pHead指向的链表的第pos个节点的前面插入一个新的节点,该节点的值为val

int i=0;

int pos;

int val;

if(is_empty(pHead)==true)

{

printf("链表为空,插入失败\n");

return;

}

PNODE p = pHead;

printf("请输入你要在第几个结点前插入:\n");

scanf("%d",&pos);

printf("请输入你要插入的值:\n");

scanf("%d",&val);

while(p != NULL && i < pos-1)

{

p = p->pNext;

i++;

}

if(i > pos-1||p == NULL)//i > pos-1是不是可有可无?????????????

{

printf("输入值非法,插入失败");

return;

}

PNODE pNew = (PNODE)malloc(sizeof(NODE));

if(pNew==NULL)

{

printf("动态分配内存失败!");

exit(-1);

}

pNew->data = val;

PNODE q = p->pNext;

p->pNext = pNew;

pNew->pNext = q;

printf("插入成功\n");

return;

}

void delete_list(PNODE pHead)//删除结点

{

int i=0;

int pos;

if(is_empty(pHead)==true)

{

printf("链表为空,删除失败\n");

return;

}

PNODE p = pHead;

printf("请输入你要删除第几个结点:\n");

scanf("%d",&pos);

while(p->pNext != NULL && i < pos-1)

{

p = p->pNext;

i++;

}

if(i > pos-1||p->pNext == NULL)//i > pos-1是不是可有可无?????????????

{

printf("输入值非法,删除失败\n");

return;

}

PNODE q=p->pNext;

printf("您删除的元素是:%d\n",q->data);

p->pNext=p->pNext->pNext;

free(q);

//q=NULL;

printf("删除成功\n");

return;

}

void sort_list(PNODE pHead)

{

if(is_empty(pHead)==true)

{

printf("链表为空,排序失败\n");

return;

}

int t;

//int i,j,t;

//int len=length_list(pHead);

PNODE p,q;

//下面跟数组对照着写

for(p=pHead->pNext;p->pNext!=NULL;p=p->pNext)//类似于数组中:for(i=1;i<len-1;i++)

{

for(q=p->pNext;q!=NULL;q=q->pNext)       //类似于数组中:for(j=1+i;j<len;j++)

{

if(p->data>q->data)                 //类似于数组中:if(a[i]>a[j])

{

t=p->data;                      //类似于数组中:t=a[i];

p->data=q->data;               //类似于数组中:a[i]=a[j];

q->data=t;                     //类似于数组中: a[j]=t;

}

}

}

printf("排序成功\n");

return;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-30 08:42:42

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

「C语言」单链表/双向链表的建立/遍历/插入/删除

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历

单链表的基本操作(建立.遍历.添加.删除)

有n个元素,我们把他们用链表表示,执行一些操作在某个位置添加一个数,或者删除某个位置的数: 输入合法的代码: #include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; struct node { int date; struct node *next; }; node *CreatList(node *head, int n); void TravList(node *hea

jQuery---jq操作标签文本(html(),text()),jq操作文档标签(插入,删除,修改),克隆,,jq操作属性,jq操作class属性,jq操作表单value,jq操作css,jq操作盒子(重要),jq操作滚动条

jQuery---jq操作标签文本(html(),text()),jq操作文档标签(插入,删除,修改),克隆,,jq操作属性,jq操作class属性,jq操作表单value,jq操作css,jq操作盒子(重要),jq操作滚动条 一丶jQ操作标签内文本 html() 标签元素中的内容 /** 替换的内容可以使一个js对象,jq对象,文本 **/ /* 获取值:获取选中标签元素的所有内容 ,包括标签*/ $('ul').html() " <li>1</li> <li&g

顺序表 初始化 插入 删除 查找 合并 交换 判断为空 求长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define ERROR -1 #define FALSE -1 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(SqList) #define MLC (Li

单链表的初始化,建立,插入,查找,删除。

#include <stdio.h> #include <stdlib.h> typedef int ElemType; //定义结点类型 typedef struct Node { ElemType data;              //单链表中的数据域 struct Node *next;          //单链表的指针域 }Node,*LinkedList; //单链表的初始化 LinkedList LinkedListInit() { Node *L; L = (N

java 集合遍历时删除元素

本文探讨集合在遍历时删除其中元素的一些注意事项,代码如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 import java.util.ArrayList; import java.util.Iterator; import java

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

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

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

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

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

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