/*
* LinkNode.c
*
* Created on: Jan 14, 2014
* Author: root
*/
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
char *data;
struct node *next;
}Node,*pNode; pNode create();
void printList(pNode pHead);
int InsertNode(pNode pHead,int front,char *data);
char* DeleteNode(pNode pHead,int pos);
int LengthList(pNode pHead);
void Sort_List(pNode pHead);
pNode Reverse_List(pNode pHead);
int main()
{ pNode pHead = NULL;
int front;
int choose;
char* return_val=NULL;
pHead=create();
printf("你输入的数据是,\n");
int length;
length = LengthList(pHead);
printf("(长度为%d的单链表):\n",length);
printList(pHead);
while()
{
printf("是否还要进行如下操作:\n");
printf("1.插入数据 2.删除数据 3.修改数据 4.链表排序 5.链表逆序 6.退出\n");
scanf("%d",&choose);
if(choose!=&&choose!=&&choose!=&&choose!=&&choose!=)
{
printf("error:请输入正确的数字!\n");
break;
}
switch(choose)
{
case :
{
printf("请输入要在第几个节点前插入数据:");
scanf("%d",&front);
if(front>length)
{
front = length;
printf("Warning:输入结点位置大于链表长度,默认在表尾部添加!\n");
}
printf("请输入要插入的数据:");
char *data = (char*)malloc(sizeof(char*));
scanf("%s",data);
if(InsertNode(pHead,front,data)==)
{
printf("插入成功\n插入后的数据是:\n");
printList(pHead);
}else
{
printf("插入失败\n");
}
break;
}
case :
{
printf("请输入要删除第几个节点的数据:");
scanf("%d",&front);
if(front>length)
{
front=length;
printf("Warning:输入结点位置大于链表长度,默认删除表最后一个结点!\n");
}
return_val = DeleteNode(pHead,front);
if(return_val==NULL)
{
printf("删除失败。\n");
}else
{
printf("删除成功。删除的元素是:%s\n",return_val);
}
printf("操作完成后的数据是:\n");
printList(pHead);
break;
}
case :
{
printf("暂时没有做这个功能!\n");
break;
}
case :
{
Sort_List(pHead);
break;
}
case :
{
Reverse_List(pHead);
break;
}
case :
{
exit();
}
return ;
} } return ;
} pNode create()
{
int i;
int len;
pNode pHead = (pNode)malloc(sizeof(struct node));
pNode pTail = pHead;
pTail->next = NULL;
printf("请输入节点个数:");
scanf("%d",&len);
for(i=;i<len;i++)
{
char *val=(char*)malloc(sizeof(char*));//Warning.malloc
printf("第 %d 个节点的数值:",i+);
scanf("%s",val);
pNode pNew = (pNode)malloc(sizeof(Node));
pNew->data = val;
/*
* 有序的
* 1.将尾节点的next指针指向新节点
* 2.然后把新节点next指针设置为空
* 3. 最后将新节点作为尾节点
*/
pTail->next=pNew;
pNew->next=NULL;
pTail = pNew;
}
printf("create list success!");
return pHead;
} void printList(pNode pHead)
{
pNode p = pHead->next;
while(p!=NULL)
{
printf("%s\n",p->data);
p=p->next;
}
printf("\n");
}
int InsertNode(pNode pHead,int front,char *data)
{
int i = ;
pNode _node = pHead;
pNode pSwap ; if((front<) || (_node==NULL))
{
printf("error:List is NULL or front<1");
return -; }
while(i<front-)
{
_node = _node->next;
++i;
}
pNode pNew = (pNode)malloc(sizeof(Node)); pNew->data=data;
pSwap = _node->next;
_node->next = pNew;
pNew->next = pSwap; return ;
} char* DeleteNode(pNode pHead,int pos)
{
int i=;
char *data;
pNode _node =pHead;
pNode pSwap ;
if((pos < ) && (NULL == _node->next))
{
printf("failed to delete ! \n");
return ;
}
while(i < pos-)
{
_node = _node->next;
++i;
}
pSwap = _node->next;
data = pSwap->data;
_node->next = _node->next->next;
free(pSwap);
return data;
} int LengthList(pNode pHead)
{
int length = ;
pNode temp = pHead->next;
while(temp!=NULL)
{
temp=temp->next;
length++;
}
return length;
} void Sort_List(pNode pHead)
{
int i , j;
char* swap ;
int len=LengthList(pHead);
pNode m,n;
for(i=,m=pHead->next;i<len-;i++,m=m->next)
{
for(j=i+,n=m->next;j<len;j++,n=n->next)
{
if(m->data > n->data)
{
swap = m->data;
m->data = n->data;
n->data = swap;
}
}
}
printf("排序完后结果为:\n");
printList(pHead);
}
pNode Reverse_List(pNode pHead)
{
if(pHead->next==NULL || pHead->next->next ==NULL)
{
return pHead;
}
pNode t=NULL;
pNode p=pHead->next;// first element
pNode q=pHead->next->next;//second element while(q!=NULL)
{
t = q->next;
q->next = p;
p=q;
q=t;
}
pHead->next->next = NULL;
pHead->next = p;
printf("逆序后结果为:\n");
printList(pHead);
return pHead; }


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. 神奇的i=i++

    最近在看c语言,被神奇的i=i++吸引,其实感觉编程是一件有趣的事情(特别喜欢算法).下面是我的测试,linux 下 gcc编译 #include<stdio.h>  main () { ...

  2. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

  3. 一个cocoapods问题的解决,希望能帮助到遇到相似情况的人

    之前10.7的系统上执行过cocoapods没有问题.如今系统版本号升级到了10.9,尝试使用cocoapods遇到问题,报告了类似以下的错误: Psych::SyntaxError - (/User ...

  4. asp.net ToString()方法介绍

      C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToStri ...

  5. CSS3六边形

    <!DOCTYPE html> <!-- saved from url=(0043)http://dbox.whosemind.net/demo/liufang.html --> ...

  6. [Java]HashMap的两种排序方式

    先将 Map 中的 key 和 value 全部取出来封装成 JavaBea 数组,再将这个数组排序,排序完成后,重新写回 Map 中,写回时采用 LinkedHashMap 可以保证迭代的顺序. 下 ...

  7. java 中有几种方法可以实现一个线程? 用什么关键字修 饰同步方法? stop()和 suspend()方法为何不推荐使用?

    java5 以前, 有如下两种:第一种:new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法, new Thread(){}表示一个Thread 的匿名子类 ...

  8. 本地搭建php环境

    AppServ 是 PHP 网页架站工具组合包,所包含的软件有:Apache[.Apache Monitor.PHP.MySQL.phpMyAdmin等,如果您的本地机器没有安装过php.mysql等 ...

  9. spoj 1557 GSS3 - Can you answer these queries III 线段树

    题目链接 给出n个数, 2种操作, 一种是将第x个数改为y, 第二种是询问区间[x,y]内的最大连续子区间. 开4个数组, 一个是区间和, 一个是区间最大值, 一个是后缀的最大值, 一个是前缀的最大值 ...

  10. Mysql innodb 后台的7大线程与3大内存

    A:一个master 线程(innodb 几乎在这个线程上实现有所有功能) B:一个lock 监控线程 C:一个错误监控线程 D:四个IO线程(insert buffer thread\log thr ...