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

 #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. java8 新特性 Stream流 分组 排序 过滤 多条件去重

    private static List<User> list = new ArrayList<User>(); public static void main(String[] ...

  2. jquery file upload使用

    <!-- jquery file upload相关js --> <script src="/js/jquery-file-upload/js/jquery.ui.widge ...

  3. svg路径动画心得

    svg动画,随着路线运动,项目中需要用到,接触的时候感觉很高级,但是不会-无从下手呀!于是在网上找相关资料,先借鉴再修改成自己的. <svg width="500" heig ...

  4. Python中级 —— 04网络编程

    网络编程 网络编程对所有开发语言都是一样的,Python也不例外.用Python进行网络编程,就是在Python程序本身这个进程内,连接别的服务器进程的通信端口进行通信. TCP编程 TCP建立可靠连 ...

  5. oracle相关操作,存储、临时表空间、用户操作、启动过程

    表空间:此空间是用来进行数据存储的(表.function.存储过程等),所以是实际物理存储区域.临时表空间:主要用途是在数据库进行排序运算[如创建索引.order by及group by.distin ...

  6. 02.centos7上搭建hadoop集群

    接上一篇  https://www.cnblogs.com/yjm0330/p/10069224.html 一.准备工作:无密登陆 1.编辑/etc/hosts文件,分别增加 192.168.2.24 ...

  7. 基于OpenCV的微信跳一跳外挂

    摘要:微信跳一跳是时下热门的微信小游戏,基本原理是根据按压屏幕的时间控制棋子跳过的距离,使其跳到下一个方块上:现利用Android adb工具,PC端获取实时截图,使用OpenCV库分析图片计算距离, ...

  8. uva 156 - Ananagrams (反片语)

    csdn:https://blog.csdn.net/su_cicada/article/details/86710107 例题5-4 反片语(Ananagrams,Uva 156) 输入一些单词,找 ...

  9. 一道hive面试题:explode map字段

    需要找到每个学生最好的课程和成绩,最差的课程和成绩,以及各科的平均分 文本数据如下: name scores张三 语文:,数学:,英语:,历史:,政治:,物理:,化学:,地理:,生物: 李四 语文:, ...

  10. Swift里performSelector方法的替代

    最近在回答StackOverflow的问题时,发现performSelector方法在Swift被去掉,Apple的注释是这个方法被去掉是因为不安全: NOTE The performSelector ...