C单链表实现
/*
* 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单链表实现的更多相关文章
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- 单链表的C++实现(采用模板类)
采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作. 链表结构定义 定义单链表 ...
- Java实现单链表的各种操作
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
- [LeetCode] Linked List Cycle II 单链表中的环之二
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...
- c++单链表基本功能
head_LinkNode.h /*单链表类的头文件*/#include<assert.h>#include"compare.h"typedef int status; ...
- 单链表、循环链表的JS实现
数据结构系列前言: 数据结构作为程序员的基本知识,需要我们每个人牢牢掌握.近期我也展开了对数据结构的二次学习,来弥补当年挖的坑...... 当时上课的时候也就是跟着听课,没有亲自实现任何一种数据结 ...
- C代码实现非循环单链表
C代码实现非循环单链表, 直接上代码. # include <stdio.h> # include <stdlib.h> # include <malloc.h> ...
- 分离的思想结合单链表实现级联组件:CascadeView
本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...
- 数据结构:单链表结构字符串(python版)添加了三个新功能
#!/urs/bin/env python # -*- coding:utf-8 -*- #异常类 class stringTypeError(TypeError): pass #节点类 class ...
- 数据结构:单链表结构字符串(python版)改进
此篇文章的replace实现了字符串类的多次匹配,但依然有些不足. 因为python字符串对象为不变对象,所以replace方法并不修改原先的字符串,而是返回修改后的字符串. 而此字符串对象时用单链表 ...
随机推荐
- Date Time Picker控件
Step1 在界面中添加一个Date Time Picker控件,ID为:IDC_DATETIMEPICKER1 Step2 该控件关联变量 CDateTimeCtrl m_dateCtrl; Ste ...
- NGINX 多个域名配置
多个域名配置: 依赖于 include 这个功能会加在 这2个文件夹下的所有配置文件. 所以我们可以配置多个 conf 放置于这些文件夹中.这样就是先了多个域名配置 conf 内容大致如下 s ...
- android 监听 USB 拔插广播消息
USBBroadcastReceiver.java package com.example.communication; import android.content.BroadcastReceive ...
- iOS中点击背景收键盘
这一次给大家带来的是ios中点击背景如何收键盘(感觉不错给个赞
- Lavarel(-) windows 部署
使用 Lavarel 开发完全可以抛开wamp,phpstudy等一键环境.因为lavarel 内置的artisan 整合了php5.4 内置的webserver ,甚至可以使用artisan 命令指 ...
- python进阶3--文件系统
文件系统 python的标准库中包括大量工具,可以处理文件系统中的文件,构造和解析文件名,也可以检查文件内容. pyhton表文件名表示为简单的字符串,另外还提供了一些工具,用来由os.path中平台 ...
- Http record java
http://httpunit.sourceforge.net/doc/servletunit-intro.html https://code.google.com/p/http-impersonat ...
- SMT贴片机抛料的成因和回流焊横向温差问题
SMT贴片机抛料的主要原因分析 在SMT生产过程中,怎么控制生产成本,提高生产效率,是企业老板及工程师们很关心的事情,而这些跟SMT贴片机的抛料率有很大的联系,以下就谈谈SMT贴片机的抛料问题. 所谓 ...
- 编程实现Windows系统自动登录
编程实现Windows系统自动登录 原理: 通过注册表修改实现.Windows内置了自动登录的机制,在登录系统时,winlogon会检查注册表下有没有设置自动登录,如果设置了就上就会读取用户名和密码, ...
- kvm 存储
1,virt-install --connect qemu:///system --name web01_lvm --ram 1024 --vcpus=1 --disk=/dev/vg_lvm/web ...