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

 #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. useradd添加用户

    sudo useradd -m -s /bin/bash $user sudo passwd $user linux useradd/userdel 命令 转自:http://hi.baidu.com ...

  2. git删除本地保存的账号和密码

    使用git在本地拉过一次代码时候git会自动将用户名密码保存到本地. 导致想用别的用户名和密码拉代码时没有权限,这时需要删除或者修改git在本地保存的账户名和密码. 具体办法如下: 1.控制面板--& ...

  3. Linux---关闭Elasticsearch进程,并重新启动

    有时候,当我们启动elasticsearch之后, 经过很长一段时间没有操作, 自己已经忘了是否已经启动了elasticsearch, 这时候我们可以通过下面的方式验证是否启动,并重新启动: step ...

  4. Apache安装排错

    今天安装一下Apache,发现报错,且在网上没有找到相关解决方法,所以记录一下 安装步骤:将下载好的apache包放置到要放置的目录中,最好是盘根目录下,然后命令行下进入到apache下面的bin目录 ...

  5. OO第三次博客作业——规格

    OO第三次博客作业——规格 一.调研结果: 规格的历史: 引自博文链接:http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世 ...

  6. Docker 学习:制作一个dockerfile

    dockerfile, 主要是四部分组成:基础镜像信息.维护者信息.镜像操作指令.容器启动执行指令. step 1: 按照语法,如下写一个centos操作系统的nignx镜像. 然后记得:wq保存和退 ...

  7. npm run build 时报错operation not permitted

    1.项目使用vue框架,在npm run build 打包时报错: 访问对应的目录,发现无法打开,原来是文件被其他应用程序占用了,仔细看了一下,xftp文件传输的软件打开着,把它关闭以后,重新运行np ...

  8. restframework序列化使用方法

    serializers.Serializer class Userinfoserializers(serializers.Serializer): username = serializers.Cha ...

  9. Vue2.5入门-2

    todolist功能开发 代码 <!DOCTYPE html> <html> <head> <title>vue 入门</title> &l ...

  10. 用GO把你想说的话写到比特币链上

    比特币除了币转账还有不少好玩的地方,比如把你想说的话写上去,可以当做留念.记录.或者装逼.今天用GO语言写了一个比特币交易构建.交易签名的程序. 生成的交易信息可以在比特币控制台用sendrawtra ...