C语言—单链表
单链表操作:读取,插入和删除
#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语言—单链表的更多相关文章
- C语言单链表实现19个功能完全详解
谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...
- C语言——单链表初始化、求表长、读表元素、插入元素
头文件Linear.h // 单链表的类型定义 typedef struct node { int data; // 数据域 struct node *next; // 指针域 }Node, *Lin ...
- c语言-单链表(二)
继续复习链表知识点,本章包含单链表的增加,删除,判断是否为空,和链表长度,以及链表的排序 几个知识点 1.链表的判断是否为空 //1.判断链表是否为空 bool isempty_list(PNODE ...
- c语言单链表实现
/************************************************************************* > File Name: singleLin ...
- C语言单链表的实现
// // main.c // gfhjhgdf // // Created by chenhao on 13-12-23. // Copyright (c) 2013年 chenhao. A ...
- c语言-单链表(一)
定义节点: typedef struct Node { int data; Node* pNext; }NODE, *PNODE; 细节说明,PNode 就代表struct Node* ,上面的表单是 ...
- 零基础玩转C语言单链表
下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...
- c语言——单链表分拆——头插法创建链表,尾插法生成链表
#if 1 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; ...
- C语言单链表简单实现(简单程序复杂化)
PS: goto还是很好玩的. #include <stdio.h> #include <stdlib.h> typedef struct _node{ int value; ...
随机推荐
- JavaScript编写学生查询系统
const readline = require('readline-sync')//引用readline-sync //用户名,密码 let user = [{ username: 'yang', ...
- 【Javascript-基础-Object】创建对象
创建单个对象--字面量方式 创建多个对象 使用字面量方式创建多个对象时,会产生大量的重复代码.开发者在寻找创建多个对象方法的过程中,基本经历了一下集中方法: 工厂模式 > 构造函数模式 > ...
- Python-常见错误梳理
1. takes exactly 1 argument (2 given) 出现此错误一般是在某对象调用类的某方法时出现.因为在python中某类的实例对象调用方法时,是首先将自身作为一个参数传入此方 ...
- node引入bootstrap npm报错
今天node引入bootstrap npm报错 但是页面正常显示 最后发现bootstrap.min.js.map没有放在文件里 虽然不用页面中引入 另外也发现了怎么看这种错误了
- Selenium+Chrome或Firefox的动态爬虫程序
新版本的Selenium不再支持PhantomJS了,请使用Chrome或Firefox的无头版本来替代.
- Liu Junqiao:生产环境中shell脚本实例
在生产环境中,我们时常要注意主机的各种硬件状态,如果是规模较大的服务集群zabbix等健康工具当然好用,如果只是一些小规模的服务主机,shell就会表现的更灵活,也更适用,今天就和大家分享一个系统巡检 ...
- 将Windows 7安装到移动固态硬盘(U盘)
由于工作的原因,有时需要用两台电脑工作,而搞开发的人大多又是追求计算机性能的人,所以笔记本电脑自然不轻,更何况两台. 两台电脑折磨我半年多,终于下定决心将个系统安装到移动固态硬盘中,背一台无硬盘电脑加 ...
- 通过XShell实现windows文件上传到Linux服务器上
.XShell上传文件到Linux服务器上 在学习Linux过程中,我们常常需要将本地文件上传到Linux主机上,这里简单记录下使用Xsheel工具进行文件传输 1:首先连接上一台Linux主机 2: ...
- PyQt5 signal and slot
PyQt5 的 signal 与 slot 有所改变,例如,先定义一个 ZeroSignal 类: class ZeroSignal(QObject): atzero = pyqtSignal(int ...
- 加法变乘法——第六届蓝桥杯C语言B组(省赛)第六题
原创 加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如:1+2+3+...+10*11+12+...+27*28+ ...