/*
* 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. [置顶] PHP如何扩展和如何在linux底层对php扩展?

    虽然大部分php工程师都不需要知道php的C代码核心是如何运作的,有些人可能知道有个dl()函数.或者使用过一些第三方的类库,这些正是本文的重点之一.            希望对那些想把php带向更 ...

  2. 1.padding和margin,几种参数

    这篇会很短. 那么如上图所示,margin指的是外边距,padding指的是内边距,border自有其像素宽度,element在1335乘以392的地方. margin和padding一样总共有四个, ...

  3. WCF:System.Security.Cryptography.CryptographicException: 密钥集不存在

    WCF使用IIS部署时,使用x509证书验证,在创建证书并正确配置程序后,访问出现错误提示: System.Security.Cryptography.CryptographicException: ...

  4. 设计模式之---模板方法template method的使用

    在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的.Template Method ...

  5. JDK源码学习--String篇(-)

    工作三年了,用了三年的JAVA,突然发现竟然没有好好的看下JDK的源码,整天用着的String,只是大概知道怎么回事,其中的实现逻辑却是一头雾水. 知耻而后勇,加油!!! java.lang.Stri ...

  6. sqlserver存储过程及易错点

    create PROCEDURE [dbo].[xiao_adduser] @username NVARCHAR(), @password NVARCHAR(), @adddate DATETIME ...

  7. Vim 实用技术,第 1 部分: 实用技巧(转)

    原文链接:http://blog.jobbole.com/20604/ 0. Vim 简介 作为开源世界最重要的编辑器之一(另一个是 Emacs),Vim 以其强大的功能和可定制能力被众多开发者所喜爱 ...

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

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

  9. Codeforces 706D Vasiliy's Multiset(可持久化字典树)

    [题目链接] http://codeforces.com/problemset/problem/706/D [题目大意] 要求实现一个集合中的三个操作,1:在集合中加入一个元素x,2:从集合中删除一个 ...

  10. 简单makefile的写法

    一个项目下的文件比较多,如果单个的输入,比较费劲,所以就需要把编译过程写进一个MakeFile文件中. 下面建立5个文件,3个cxx文件,2个hxx头文件 //filename main.cxx #i ...