老师版

 #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. openstack nova修改实例路径,虚拟磁盘路径

    #实例路径 --instances_path=$state_path/instances #日志的目录 --logdir=/var/log/nova #nova的目录 --state_path=/va ...

  2. How to get the xpath by clicking an html element

    How to get the xpath by clicking an html element How to get the xpath by clicking an html element

  3. (Android) ContentProvider 实例

    ContentProvider 用于应用程序(Android Application)之间传递数据,包括Insert, update, delete, query. 下面的例子是在两个应用之间传递数据 ...

  4. 展开字符串(dfs)

    展开字符串 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  5. ASP.NET之电子商务系统开发-4(二级分类)

    一.前言 继上次的订单,这是第四篇.记录一下分类和筛选.这功能是最后做的,因为我完全不懂其原理.后来通过同学的指导(一位很有天赋的同学,比我牛逼一个层次,同样是高三.:D),终于也是完成了.在写这篇博 ...

  6. Struts学习之值栈的理解

    转自:http://blog.csdn.net/hanxuemin12345/article/details/38559979 页面一个请求发送过来,依次经过一系列拦截器(处理公共部分,如:往数据中心 ...

  7. [LeetCode]题解(python):085-Maximal Rectangle

    题目来源: https://leetcode.com/problems/maximal-rectangle/ 题意分析: 给定一个二维的二进制矩阵,也就是只包括0 和 1的,找出只包括1的最大的矩阵的 ...

  8. hdu 2815 Mod Tree 高次方程,n不为素数

    Accepted 406MS 8576K 2379 B C++/** 这里加了一点限制,,大体还是一样的,, **/ #include <iostream> #include <cs ...

  9. 从基因组可视化工具——circos说起,circos安装

      这是博客改版的第一篇博文,选择最近使用的生物信息学软件——circos开始写起.circos是用perl写的生物软件,从发表的文章来看 学习circos主要是熟悉配置文件的编辑方法,搞清楚其中的标 ...

  10. 帝国cms7.0 内容页控制简介字数!

    帝国cms7.0 内容页有简介部分,使用以下代码可以有效控制字数限制! 下载类简介:<?=esub($navinfor[softsay],160)?> 文章类简介:<?=esub($ ...