单链表操作:读取,插入和删除

 #include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h> struct Node
{
int val;
struct Node *next;
}; // build No head node
struct Node * build_N_LinkList(int a[], int len)
{
struct Node * phead = NULL; //struct Node * phead, last;
struct Node * last = NULL;
int k;
for (k = ; k <=len-; k++)
{
struct Node * pnewnode = (struct Node *)malloc(sizeof(struct Node));
pnewnode->val = a[k];
pnewnode->next = NULL;
if (k == )
{
phead = pnewnode;
/*last->next = pnewnode;*/
last = pnewnode;
}
else
{
last->next = pnewnode;
last = pnewnode;
}
}
return phead;
} //build Head node
struct Node *build_H_LinkList(int a[], int len )
{
struct Node * headnode = (struct Node *)malloc(sizeof(struct Node));
int k;
struct Node * phead = NULL;
struct Node * plast = NULL;
for (k = ; k <= len - ; k++)
{
struct Node * newnode = (struct Node *)malloc(sizeof(struct Node));
newnode->val = a[k];
newnode->next = NULL;
if (k == )
{
headnode->next = newnode;
phead = headnode;
plast = newnode;
}
else
{
plast->next = newnode;
plast = newnode;
}
}
return phead;
} // read with no head node
int GetElem(struct Node *phead, int i)
{
int k = i;
struct Node * p;
p = phead;
if (NULL==p) //这就是为什么很多时候常量(NULL)写在前面的原因,一旦写成“=”,编绎器就会报错,就可以直接看出来 ,你以后会经常看到这种写法
return -;
while (k != )
{
p = p -> next;
--k;
}
return p->val;
} //insert element before ith. (no head node)//放在最后一个算插入么???
int ListInsert_N (struct Node *phead, int a, int i, int len)
{
int k =,m;
struct Node *p = phead;
struct Node *pr = phead;
struct Node *newnode = (struct Node*)malloc(sizeof (struct Node));
newnode->val = a;
newnode->next = NULL;
if (i <= || i > len + ) //either first or last
return -;
else if (i==) //first
{
newnode->next = p;
pr = newnode;
}
else //1 < i <= len+1, middle&last
{ while (k<i-)
{
p = p-> next;
++k;
}
newnode ->next = p->next;
p->next = newnode;
}
len = len + ;
for (m = ; m <= len; m++)
{
printf("%d\n", pr->val);
pr = pr->next;
}
return ;
} //insert element before ith. (with head node)
int ListInsert_H(struct Node *phead, int a, int i, int len)
{
struct Node * p = phead;
struct Node * pr = phead;
struct Node *newnode = (struct Node *)malloc(sizeof(struct Node));
newnode->val = a;
newnode->next = NULL;
int k = ;
int m;
if (i <= || i > len + )//
return -;
else
{ while (k < i)//i==len+1 : add in last.
{
p = p ->next;
++k;
}
//此时p指向啥?第i个节点?k==i,退出循环,p指向i?
newnode->next = p->next;
p->next = newnode;
} len = len + ;
for (m = ; m <= len; m++)
{
pr = pr->next;
printf("%d\n", pr->val);
}
return ;
} // delete element before ith (No head node)
int ListDelete_N(struct Node *phead, int i, int len)
{
int k;
int m;
struct Node *p = phead;
struct Node *q = NULL;
struct Node *pr = phead;
if (i <= || i > len)
return -;
else if (i == )
{
q = p;
pr = p->next;
free(q);
}
else
{
k = i-;
while (k != )
{
p = p->next;
--k;
}
q = p->next;
p->next = q->next;
free(q);
}
len = len - ;
for (m = ; m <= len; m++)
{
printf("%d\n", pr->val);
pr = pr->next;
}
return ;
} //delete element before ith (Head node)
int ListDelete_H(struct Node * phead, int i, int len)
{
struct Node *p = phead;
struct Node *pr = phead;
struct Node *q = NULL;
int k,m ;
if (i <= || i > len)
return -;
else
{
k = i - ;
while ( k != )
{
p = p->next;
--k;
}
q = p->next;
p->next = q->next;
free(q);
}
len = len - ;
for (m = ; m <= len; m++)
{
pr = pr->next;
printf("%d\n", pr->val);
} } int main()
{
int a[] = { ,,,, };
int len,tmp;
struct Node * phead; len = sizeof(a) / sizeof(a[]); //注意:是sizeof(a),不是sizeof(a[])。
phead = build_H_LinkList(a, len); //注意:是a,不是a[]。
//phead = build_N_LinkList(a, len); //注意:是a,不是a[]。
//ListInsert_H(phead,8,2,len);
//ListInsert_N(phead, 8, 6, len);
//ListDelete_N(phead, 5,len);
ListDelete_H(phead, , len);
//tmp = GetElem(phead, 3);
//printf("%d\n", tmp);
}

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

  1. C语言单链表实现19个功能完全详解

    谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...

  2. C语言——单链表初始化、求表长、读表元素、插入元素

    头文件Linear.h // 单链表的类型定义 typedef struct node { int data; // 数据域 struct node *next; // 指针域 }Node, *Lin ...

  3. c语言-单链表(二)

    继续复习链表知识点,本章包含单链表的增加,删除,判断是否为空,和链表长度,以及链表的排序 几个知识点 1.链表的判断是否为空 //1.判断链表是否为空 bool isempty_list(PNODE ...

  4. c语言单链表实现

    /************************************************************************* > File Name: singleLin ...

  5. C语言单链表的实现

    // //  main.c //  gfhjhgdf // //  Created by chenhao on 13-12-23. //  Copyright (c) 2013年 chenhao. A ...

  6. c语言-单链表(一)

    定义节点: typedef struct Node { int data; Node* pNext; }NODE, *PNODE; 细节说明,PNode 就代表struct Node* ,上面的表单是 ...

  7. 零基础玩转C语言单链表

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

  8. c语言——单链表分拆——头插法创建链表,尾插法生成链表

    #if 1 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; ...

  9. C语言单链表简单实现(简单程序复杂化)

    PS: goto还是很好玩的. #include <stdio.h> #include <stdlib.h> typedef struct _node{ int value; ...

随机推荐

  1. Java接口和抽象类详解

    父类定义了相关子类的共有属性和行为.而接口可以定义类的共同行为(包括非相关的类). 了解接口前,先来说说抽象类.抽象类介乎于普通类和接口之间,提供部分实现方法以及未实现方法,可以看作为一个半成品. 抽 ...

  2. iOS audio不支持循环播放

    解决办法:监听播放完成事件(注意点,audio标签不能设置循环播放,去除标签 loop="loop"或者 loop="false",不然不走播放完成事件) $( ...

  3. struct tm

    struct tm { int tm_sec; /* 秒–取值区间为[0,59] */ int tm_min; /* 分 - 取值区间为[0,59] */ int tm_hour; /* 时 - 取值 ...

  4. 腾讯云的对象存储COS

    什么是对象存储COS Clound Object Storage,COS,专门为企业和开发者们提供能够存储海量的分布式存储服务,用户可以随时通过互联网对大量数据进行批量存储和处理,在任意位置存储和检索 ...

  5. MySQL安装及配置

    MySQL安装 我是在Windows上安装的MySQL.首先登录MySQL的官网下载安装包. 最后献上5.5.28这个服务器的下载连接地址: http://cdn.mysql.com/Download ...

  6. docker入门——安装(CentOS)、镜像、容器

    Docker简介 什么是docker 官方解释: Docker is the company driving the container movement and the only container ...

  7. 【八】将日志写入log(glog)

    [任务8]将日志写入log(glog) glog简介 glog是google开源的一个日志系统,相比较log4系列的日志系统,它更加轻巧灵活,而且功能也比较完善 glog配置使用资料 下载glog 命 ...

  8. Hive HQL基本操作

    一. DDL操作 (数据定义语言) 具体参见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL 其实就是我们在创建 ...

  9. 20155229——实验五《 Java网络编程及安全》

    20155229--实验五 Java网络编程及安全 实验内容 实验一: 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA ...

  10. 20155318 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155318 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)命令行下Java程序开发 步骤一(新建文件夹): 打开windows下的cmd → ...