老师版

 #include <stdio.h>
#include <stdlib.h> // 定于Node数据类型
struct Node
{
int data; // 数据域
struct Node *next; // 指针域
}; // 创建一个单链表,并把head节点返回;
struct Node* createLinkList(void);
struct Node* createLinkList(void)
{
struct Node *head = NULL;
struct Node *tail = NULL;
struct Node *temp = NULL; int data; scanf("%d",&data);
// data 不等于0
while (data)
{
// malloc 函数申请内存
temp = (struct Node *)malloc(sizeof(struct Node));
temp->data = data;
temp->next = NULL; if (head == NULL)
{
head = temp;
tail = temp;
}
else
{
tail->next = temp;
tail = temp;
} scanf("%d",&data);
} return head;
} // 输出链表元素
void printLinkList(struct Node *head);
void printLinkList(struct Node *head)
{
struct Node *p = head;
if (p == NULL)
{
return;
}
else
{
while (p)
{
printf("%d-》",p->data);
// 指针重定向
p = p->next;
}
}
} // 计算链表的长度
int count(struct Node *head);
int count(struct Node *head)
{
int count = ;
struct Node *p = NULL;
p = head;
while (p)
{
count++;
p = p->next;
} return count;
} int getNode(struct Node *head,int pos);
int getNode(struct Node *head,int pos)
{
if (pos > count(head))
{
return ;
} struct Node *p = head;
for (int i = ; i < pos; i++)
{
p = p->next;
} return p->data;
} void insertIntoHead(struct Node **h,int value);
void insertIntoHead(struct Node **h,int value)
{
struct Node *temp = NULL;
temp = (struct Node *)malloc(sizeof(struct Node));
temp->data = value;
temp->next = NULL; if (h == NULL)
{
*h = temp;
}
else
{
temp->next = *h;
*h = temp;
}
} //2、把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0
int modifyNode(struct Node *head,int pos,int x);
int modifyNode(struct Node *head,int pos,int x)
{
// 如果链表为空,或者pos 超出链表长度
if (head == NULL || pos > count(head))
{
return ;
} struct Node *p = NULL;
p = head;
for (int i = ; i < pos; i++)
{
p = p->next;
} p->data = x;
return ;
} void insertIntoTail(struct Node **head,int value);
void insertIntoTail(struct Node **head,int value)
{
struct Node *tmp = NULL;
tmp = malloc(sizeof(struct Node));
tmp->data = value;
tmp->next = NULL;
if (*head == NULL)
{
*head = tmp;
}
else
{
struct Node *p;
// 定位最后一个节点
p = *head;
while (p->next)
{
p = p->next;
}
// 将申请的tmp加到链表后面
p->next = tmp;
}
} int insertInto(struct Node **head,int pos,int value);
int insertInto(struct Node **head,int pos,int value)
{
if (*head == NULL)
{
// 在第一个位置添加一个节点
insertIntoHead(head, value);
return ;
}
if (pos > count(*head))
{
// 在最后一个位置添加一个节点
insertIntoTail(head, value);
return ;
}
// 申请一个节点
struct Node *tmp;
tmp = malloc(sizeof(struct Node));
tmp->data = value;
tmp->next = NULL;
if (tmp==NULL)//tmp 申请内存失败
{
return ;
}
else
{
// 声明一个辅助指针
struct Node *p;
p = *head;
// 定位辅助指针,指向pos位置前一个节点
for (int i = ; i<pos-; i++)
{
p = p->next;
}
tmp->next = p->next;
p->next = tmp;
return ;
}
} void insertIntoSortedList(struct Node **head,int value);
void insertIntoSortedList(struct Node **head,int value)
{
// 如果是链表为空,在第一个位置添加
if (*head == NULL)
{
insertIntoHead(head, value);
return;
} // 记录要添加元素的位置
int pos = ;
struct Node *p = NULL;
p = *head;
while (p)
{
if (p->data < value)
{
pos++;
p = p->next;
}
else
{
// 跳出循环
break;
}
} insertInto(head, pos, value);
} int deleteFirstNode(struct Node **head);
int deleteFirstNode(struct Node **head)
{
if (*head == NULL)
{
return ;
} struct Node *p = NULL;
p = *head; *head = p->next;
int result = p->data; // 注意释放内存
free(p);
p = NULL; return result; } int deleteTailNode(struct Node **head);
int deleteTailNode(struct Node **head)
{
if (*head == NULL)
{
return ;
} struct Node *p,*q;
p = q = NULL;
p = *head;
q = p->next;
// 通过循环定位让q指向最后一个节点,p指向q前面一个节点
for (int i = ; i <= count(*head)-; i++)
{
p = q;
q = q->next;
}
// 取最后一个节点的数据
int result = q->data; p->next = NULL;
free(q);
q = NULL; return result;
} int main(int argc, const char * argv[])
{ struct Node *head = NULL;
// 产生链表
head = createLinkList(); // 输出链表元素个数
int c = count(head);
printf("c = %d\n",c); //insertIntoHead(&head, 10); //modifyNode(head, 2, 10); //insertIntoTail(&head, 100);
//insertInto(&head, 2, 100); //insertIntoSortedList(&head, 6);
//deleteFirstNode(&head);
int r = deleteTailNode(&head);
printf("删除最后一个节点%d\n",r); // 输出链表
printLinkList(head); /*
// 输出第二个节点的数据域;
c = getNode(head, 2);
printf("\n");
printf("c = %d\n",c);
*/ return ;
}

不才版

 #include <stdio.h>

 #include <stdlib.h>

 struct Node
{
int data;
struct Node *next;
}; struct Node *creatLinkList(void)
{
struct Node *head=NULL;
struct Node *tail=NULL;
struct Node *temp=NULL; int data;
scanf("%d",&data);
while (data)
{
temp=malloc(sizeof(struct Node));
temp->data=data;
temp->next=NULL; if(head==NULL)
head=tail=temp;
else
{
tail->next=temp;
tail=temp;
}
scanf("%d",&data);
}
return head;
} void printLinkList(struct Node *head)
{
struct Node *tmp=head;
if (tmp==NULL) {
return;
}
while (tmp!=NULL) {
printf("%d->>",tmp->data);
tmp=tmp->next;
}
printf("\n");
} int toNode(struct Node *head,int pos)
{
int data;
for (int i=; i<pos; i++) {
if ((i!=pos-)&&(head->next==NULL))
return ;
data=head->data;
head=head->next;
}
return data; //链表长度可以用count(head)算出。
} int changeData(struct Node *head,int pos,int x)
{
for (int i=; i<pos; i++) {
if ((i!=pos-)&&(head->next==NULL))
return ;
if (i==pos-) {
head->data=x;
}
head=head->next;
}
return ;
} void insertNodeInHead(struct Node **head,int value)
{
struct Node *tmp=NULL;
tmp=(struct Node *)malloc(sizeof(struct Node));
tmp->data=value;
tmp->next=*head;
*head=tmp;
} void insertNodeInEnd(struct Node *head,int value)
{
struct Node *tmp=NULL;
tmp=(struct Node *)malloc(sizeof(struct Node));
tmp->data=value;
tmp->next=NULL;
if (head==NULL) {
head=tmp;
}
while (head->next!=NULL) {
head=head->next;
}
head->next=tmp;
} int insertData(struct Node *head,int pos,int value)
{
struct Node *tmp=NULL;
tmp=(struct Node *)malloc(sizeof(struct Node));
if (tmp==NULL) {
return ;
}
tmp->data=value;
if (pos==) {
return ;
}
for (int i=; i<pos; i++) { if ((i!=pos-)&&(head->next==NULL)) {
return ;
}
if (i==pos-) {
tmp->next=head->next;
head->next=tmp;
}
head=head->next;
}
return ;
} void insertSortData(struct Node *head,int value)
{
struct Node *tmp=(struct Node *)malloc(sizeof(struct Node));
tmp->data=value;
while (head->data<tmp->data) {
if (head->next->data>=tmp->data) {
tmp->next=head->next;
head->next=tmp;
return;
}
if (head->next==NULL) {
tmp->next=head->next;
head->next=tmp;
return;
}
head=head->next;
} } int deleteHead(struct Node **pointhead)
{
int data;
data=(*pointhead)->data;
struct Node *p=*pointhead;
*pointhead=(*pointhead)->next;
free(p);
p=NULL;
if (*pointhead==NULL||(*pointhead)->next==NULL) {
return ;
}
return data;
} int deleteEnd(struct Node *head)
{
struct Node *tmp=head;
int data;
if(head==NULL||head->next==NULL)
return ;
while (tmp->next!=NULL) {
if (tmp->next->next==NULL) {
data=tmp->next->data;
free(tmp->next);
tmp->next=NULL;
break;
}
tmp=tmp->next;
}
return data;
} int main(int argc,const char *argv[])
{
struct Node *h = creatLinkList();
printLinkList(h); //1、返回单链表中第pos个结点中的元素,若pos超出范围,则返回0
printf("%d\n",toNode(h,)); //2、把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0
if (changeData(h,,)) {
printLinkList(h);
} //3、向单链表的表头插入一个元素
insertNodeInHead(&h, );
printLinkList(h); //4、向单链表的末尾添加一个元素
insertNodeInEnd(h, );
printLinkList(h); //5、向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0
if(insertData(h, , ))
printLinkList(h); //6、向有序单链表中插入元素x结点,使得插入后仍然有序
insertSortData(h, );
printLinkList(h); //7、从单链表中删除表头结点,并把该结点的值返回,若删除失败则返回0
printf("%d\n",deleteHead(&h));
printLinkList(h); //8、从单链表中删除表尾结点并返回它的值,若删除失败则返回0
printf("%d\n",deleteEnd(h));
printLinkList(h); return ;
}

(C)单链表的更多相关文章

  1. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  2. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  3. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  4. [LeetCode] Linked List Cycle II 单链表中的环之二

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  5. c++单链表基本功能

    head_LinkNode.h /*单链表类的头文件*/#include<assert.h>#include"compare.h"typedef int status; ...

  6. 单链表、循环链表的JS实现

    数据结构系列前言: 数据结构作为程序员的基本知识,需要我们每个人牢牢掌握.近期我也展开了对数据结构的二次学习,来弥补当年挖的坑......   当时上课的时候也就是跟着听课,没有亲自实现任何一种数据结 ...

  7. C代码实现非循环单链表

    C代码实现非循环单链表, 直接上代码. # include <stdio.h> # include <stdlib.h> # include <malloc.h> ...

  8. 分离的思想结合单链表实现级联组件:CascadeView

    本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...

  9. 数据结构:单链表结构字符串(python版)添加了三个新功能

    #!/urs/bin/env python # -*- coding:utf-8 -*- #异常类 class stringTypeError(TypeError): pass #节点类 class ...

  10. 数据结构:单链表结构字符串(python版)改进

    此篇文章的replace实现了字符串类的多次匹配,但依然有些不足. 因为python字符串对象为不变对象,所以replace方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...

随机推荐

  1. Codeforces 713C Sonya and Problem Wihtout a Legend(单调DP)

    [题目链接] http://codeforces.com/problemset/problem/713/C [题目大意] 给出一个数列,请你经过调整使得其成为严格单调递增的数列,调整就是给某些位置加上 ...

  2. WebSite 文件上传Demo

    知识点: 1 <!--上传文件时:        1.必须使用Post方式来提交数据        2.必须设置表单的enctype属性        3.必须在表单中包含文件域.input t ...

  3. mvc模式jsp+servel+jdbc oracle基本增删改查demo

    mvc模式jsp+servel+jdbc oracle基本增删改查demo 下载地址

  4. BZOJ 1050 旅行comf

    题目如下: 题目描述 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大边 ...

  5. CTRL+A, CTRL+C, CTRL+V

    (http://leetcode.com/2011/01/ctrla-ctrlc-ctrlv.html) Imagine you have a special keyboard with the fo ...

  6. Android应用开发基础篇(9)-----SharedPreferences

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/27/2370319.html 一.概述 对于SharedPreferences,我吧它理解为一种 ...

  7. Linux 网络编程: xinetd time

    前言 终于把 xinetd 服务装好了,那就在来实现一下 TCP 协议从服务器和本机获取时间吧.那么多思想汇报还没写,我也是醉了. 安装 xinetd apt-get install xinetd 配 ...

  8. 电脑cmos是什么?和bois的区别?

    很多人都分不清电脑cmos和bois区别,有人一会儿说什么bois设置,有人一会儿说cmos设置.而看起来这两个又似乎差不多,本文将用最简单的白话文告诉各位,什么是cmos,以及cmos和bois的的 ...

  9. NHibernate 的 ID 标识选择器

    在 Hibernate 中,每个对象需要一个标识 ID,通过这个标识 ID 建立对象与数据库中记录的对应关系. Nhibernate 提供了多种方式来建立这个 POID.基于不同的生成策略,可以选择更 ...

  10. Mac OS X Mavericks or Yosemite 安装Nginx、PHP、Mysql、phpMyAdmin

    翻译:http://blog.frd.mn/install-nginx-php-fpm-mysql-and-phpmyadmin-on-os-x-mavericks-using-homebrew/ 最 ...