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

typedef struct Node
{
int data;
Node * pNext;
}NODE,* PNODE;

PNODE create_List();
void traverse_List(PNODE pHead);
bool is_empty(PNODE pHead);
int length_List(PNODE pHead);
bool insert_List(PNODE pHead,int position,int num);
bool delete_List(PNODE pHead,int position,int * num);
void sort_List(PNODE pHead);

int main()
{
int num;
PNODE pHead=NULL;
pHead=create_List();
traverse_List(pHead);
if(is_empty(pHead))
{
printf("链表为空\n");
}
printf("链表长度为%d\n",length_List(pHead));
sort_List(pHead);
printf("排序后:\n");
traverse_List(pHead);
insert_List(pHead,2,2);
printf("添加元素后:\n");
traverse_List(pHead);
delete_List(pHead,2,&num);
printf("删除值为%d的元素2后:\n",num);
traverse_List(pHead);
return 0;
}

PNODE create_List()
{
int len;
int val;
PNODE pHead=(PNODE)malloc(sizeof(NODE));
if(NULL==pHead)
{
printf("分配失败,程序终止\n");
exit(0);
}
PNODE pTail=pHead;
pTail->pNext=NULL;

printf("请输入要生成的节点个数:");
scanf("%d",&len);

for(int i=0;i<len;i++)
{
printf("请输入第%d个节点的值:",i+1);
scanf("%d",&val);
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(NULL==pNew)
{
printf("分配失败,程序终止\n");
exit(0);
}
pNew->data=val;
pTail->pNext=pNew;
pNew->pNext=NULL;
pTail=pNew;
}
return pHead;
}

void traverse_List(PNODE pHead)
{
PNODE temp=pHead->pNext;
while(temp!=NULL)
{
printf("%d\n",temp->data);
temp=temp->pNext;
}
}

bool is_empty(PNODE pHead)
{
if(NULL==pHead->pNext)
{
return true;
}
else
{
return false;
}
}

int length_List(PNODE pHead)
{
int len=0;
PNODE temp=pHead->pNext;
while(temp)
{
len++;
temp=temp->pNext;
}
return len;
}

void sort_List(PNODE pHead)
{
PNODE p,q;
int i,j,temp;
int len=length_List(pHead);
for(i=0,p=pHead->pNext;i<len-1;i++,p=p->pNext)
{
for(j=i+1,q=p->pNext;j<len;j++,q=q->pNext)
{
if(q->data<p->data)
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
}

bool insert_List(PNODE pHead,int position,int num)
{
int i=0;
PNODE p=pHead;

while(NULL!=p&&i<position-1)
{
p=p->pNext;
i++;
}
if(i>position-i||NULL==p)
{
return false;
}
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(NULL==pNew)
{
printf("分配失败,程序终止\n");
exit(0);
}
pNew->data=num;
pNew->pNext=p->pNext;
p->pNext=pNew;
return true;
}

bool delete_List(PNODE pHead,int position,int * num)
{
int i=0;
PNODE p=pHead;

while(NULL!=p->pNext&&i<position-1)
{
p=p->pNext;
i++;
}
if(i>position-i||NULL==p->pNext)
{
return false;
}
PNODE q=p->pNext;
*num=q->data;
p->pNext=p->pNext->pNext;
free(q);
q=NULL;
return true;
}

C语言链表的更多相关文章

  1. C语言 链表

    原文:C语言 链表 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能. ...

  2. C语言链表操作模板(添加,删除,遍历,排序)

    C语言链表操作模板,摘自郝斌的C语言视频教程,简单的修改成了纯C格式.当年照着视频学习的时候记录下来的,在使用的时候直接拿来修改修改修改能节约不少时间的. /********************* ...

  3. ZT C语言链表操作(新增单向链表的逆序建立)

    这个不好懂,不如看 转贴:C语言链表基本操作http://www.cnblogs.com/jeanschen/p/3542668.html ZT 链表逆序http://www.cnblogs.com/ ...

  4. C语言链表结构体(学习笔记)

    #include <stdio.h> #define LENTEST 100 // 采取逐步删除的方法求的素数 //先假设1-100都是素数,然后剔除2的倍数, //3的倍数,直到剔除所有 ...

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

    下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...

  6. c语言-链表VS数组

    数组和链表的区别   数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要 ...

  7. 再次复习数据结构:c语言链表的简单操作

    最近呢,又要面临多次的数据结构与算法方面的试题了,而我呢,大概也重新温习c语言的基本要点快一个月了,主要是针对指针这货的角度在研究c语言,感觉又学到了不少. 现在c指针感觉知道点了,也就匆忙开展数据结 ...

  8. [数据结构]C语言链表实现

    我学数据结构的时候也是感觉很困难,当我学完后我发现了之所以困难时因为我没有系统的进行学习,而且很多教授都只是注重数据结构思想,而忽略了代码方面,为此我写了这些博文给那些试图自学数据结构的朋友,希望你们 ...

  9. [C语言]链表实现贪吃蛇及部分模块优化

    在继上篇[C语言]贪吃蛇_结构数组实现大半年后,链表实现的版本也终于出炉了.两篇隔了这么久除了是懒癌晚期的原因外,对整个游戏流程的改进,模块的精简也花了一些时间(都是借口). 优化模块的前沿链接: · ...

  10. 玩转C语言链表-链表各类操作详解

    链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个"头指针"变量,以head表示,它存放一个地址.该地址指向一个元素 ...

随机推荐

  1. div相对浏览器移动

    <%    String path = request.getContextPath();%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTM ...

  2. 草珊瑚的css基础

    首先要了解如下概念: viewport,窗口大小,containing block,block formatting context,inline formatting context,dirctio ...

  3. Eclipse 高亮显示选中的相同变量

    问题描述: 在 eclipse 中使用快捷键或其他原因,不小心按错了,使得变量的高亮显示没了. 1.网友解决方法:  选择:windows-> preferences->java-> ...

  4. Java中String,StringBuffer,StringBuilder的区别及其使用

    由于笔试面试经常会问到这个问题,所以在这里先把这些问题搞清楚. String:自JDK1.0开始即有,源码中对String的描述: "Strings are constant; their ...

  5. iOS - UIProgressView

    前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIProgressView : UIView <NSCoding> @available(iOS 2. ...

  6. MySql 去重且指定某字段在前的排序方法

    今天遇到一个棘手的数据查找并去重的问题: 情况: 1.取出数据库中的数据: 2.同一字段A,不同情况<值,如A值为:a1,a2>下取出的其他数据可能相同: 3.将2情况下的重复数据< ...

  7. 老笔记本_Win7_U盘_ReadyBoost

    老笔记本 Win7 U盘 ReadyBoost 值得尝试

  8. 09 高效的PL/SQL程序设计

    程序包 Package 断开了依赖链 实验依赖关系: <1> 首先不使用包 -- 创建表 CREATE table t (x int); -- 创建视图 create view v as ...

  9. poj2986A Triangle and a Circle&&poj3675Telescope(三角形剖分)

    链接 2986是3675的简化版,只有一个三角形. 这题主要在于求剖分后三角形与圆的相交面积,需要分情况讨论. 具体可以看此博客 http://hi.baidu.com/billdu/item/703 ...

  10. django连接mysql自动同步生成数据表

    python manage.py makemigrations python manage.py migrate 如果是 Django 不主动提示创建管理员(Django 1.9不提示)用下面的命令创 ...