C语言单链表的实现
//
// main.c
// gfhjhgdf
//
// Created by chenhao on 13-12-23.
// Copyright (c) 2013年 chenhao. All rights reserved.
//
#include"stdio.h"
#include <stdlib.h>
typedefstruct List_Node{
int info;
struct List_Node *next;
}node;
//链表长度
int Count_Node(node *head)
{
node *p;
int num = 0;
if (head == NULL)
{
return 0;
}
p = head->next;
while(p!=NULL)
{
num++;
p = p->next;
}
return num;
}
//按值查找
void FindByValue(node *head, int v)
{
node *p;
int i = 0, num = 0;
if (head == NULL)
{
return;
}
p = head->next;
while(p != NULL)
{
i++;
if (p->info == v)
{
num++;
printf("%d ",i);
}
p = p->next;
}
printf("找到%d个等于%d的值",num,v);
}
//插入元素
void InsertItem(node *head, int loc, int num)
{
node *p, *pre, *s;
int i = 0;
if (loc > Count_Node(head)||loc < 0)
{
printf("插入位置错误\n");
return;
}
if (head == NULL)
{
return;
}
pre = head;
p = head->next;
while(i != loc)
{
i++;
pre = p;
p = p->next;
}
s = (node*)malloc(sizeof(node));
s->info = num;
s->next = p;
pre->next = s;
}
//删除元素
int deleteItem(node *head, int loc)
{
node *p, *pre;
int i=1, num=0;
if (loc>Count_Node(head)||loc<=0)
{
printf("删除位置错误\n");
return0;
}
if (head == NULL)
{
return0;
}
pre = head;
p = pre->next;
while(i!=loc)
{
i++;
pre = p;
p=p->next;
}
num = p->info;
pre->next = p->next;
p->next = NULL;
free(p);
return num;
}
//清空链表
void FlushLink(node *head)
{
node *p;
if (head == NULL)
{
return;
}
p = head->next;
head->next = NULL;
free(p);
}
//销毁链表
void DestoryLink(node *head)
{
free(head);
}
//按序号查找
int FindByNo(node *head, int loc)
{
node *p;
int i=1;
if (loc>Count_Node(head)||loc<=0)
{
printf("位置错误\n");
return0;
}
if (head == NULL)
{
return0;
}
p = head->next;
while(i!=loc)
{
i++;
p=p->next;
}
return p->info;
}
//尾插法建立带头结点的单链表
node* Creat_Node()
{
node *head,*pre,*p;
int x;
head=(node*)malloc(sizeof(node));;
head->next=NULL;
pre=head;
printf("输入各结点的值,以0结束:");
while(EOF!=(scanf("%d",&x))&&x!=0)
{
p=(node*)malloc(sizeof(node));
p->info=x;
p->next=pre->next;
pre->next=p;
pre=pre->next;
}
return head;
}
//头插法建立带头结点的单链表
node* Build_Node()
{
node *head,*p;
int x;
head=(node*)malloc(sizeof(node));;
head->next=NULL;
printf("输入各结点的值,以0结束:");
while(EOF!=(scanf("%d",&x))&&x!=0)
{
p=(node*)malloc(sizeof(node));
p->info=x;
p->next=head->next;
head->next=p;
}
return head;
}
//在Y前插入X
void Before_y_Insert_x(node* head,int y,int x)
{
node *pre,*p,*s;
if (head ==NULL)
{
return;
}
pre=head;
p=pre->next;
while(p&&p->info!=y)
{
pre=p;
p=p->next;
}
if(p==NULL)
{
printf("error!%d不在该链表中\n",y);
}
else
{
s=(node*)malloc(sizeof(node));
s->info=x;
s->next=p;
pre->next=s;
}
}
//判断链表是否有序
int Is_Sort(node *head)
{
node *p,*pre;
int flag;
if (head ==NULL)
{
return0;
}
pre=head->next;
p=pre->next;
flag=pre->info>p->info?1:0;
while(p)
{
pre=p;
p=p->next;
if(p)
{
if(flag!=pre->info>p->info?1:0)
{
return 0;
}
}
}
return1;
}
//链表反序
void convert_Node(node *head)
{
node *pre,*p=head->next;
if (head ==NULL)
{
return;
}
head->next=NULL;
while(p)
{
pre=p;
p=p->next;
pre->next=NULL;
pre->next=head->next;
head->next=pre;
}
}
//打印单链表
void Print_Node(node *head)
{
node *p;
if (head ==NULL)
{
return;
}
p=head->next;
printf("输出该链表:");
while(p)
{
printf("%-5d--->",p->info);
p=p->next;
}
if(p==NULL)
{
printf("^\n\n\n");
}
}
void menu()
{
printf(" 1:尾插法创建带头节点的链表\n");
printf(" 2:头插法创建带头节点的链表\n");
printf(" 3:链表长度\n");
printf(" 4:在Y前插入X \n");
printf(" 5:判断链表是否有序\n");
printf(" 6:链表反序 \n");
printf(" 7:按值查找\n");
printf(" 8:插入元素\n");
printf(" 9:删除元素\n");
printf(" 10:按序号查找\n");
printf(" 11:清空链表\n");
printf(" 12:销毁链表\n");
printf(" 13:打印链表\n");
printf(" 14:退出\n");
}
int main()
{
int goon = 1;
node *head=NULL;//*head1=NULL,*head2=NULL;
int x=0, y=0;
//int flag = 0;
int choice;
menu();
while(goon)
{
printf("请选择:\n");
scanf("%d",&choice);
switch (choice)
{
case 0:
menu();
break;
case 1:
printf("尾插法创建带头节点的链表\n");
head=Creat_Node();
break;
case 2:
printf("头插法创建带头节点的链表\n");
head=Creat_Node();
break;
case 3:
printf("链表长度\n");
printf("链表长度为%d\n",Count_Node(head));
break;
case 4:
printf("在Y前插入X\n请输入X和Y:\n");
scanf("%d%d",&x,&y);
Before_y_Insert_x(head,y,x);
break;
case 5:
printf("判断链表是否有序\n");
if(Is_Sort(head)==1)
{
printf("该链表有序!\n");
}
else
{
printf("该链表无序!\n");
}
break;
case 6:
printf("链表反序\n");
convert_Node(head);
break;
case 7:
printf("按值查找\n请输入要查找的值\n");
scanf("%d",&x);
FindByValue(head,x);
break;
case 8:
printf("插入元素\n请输入插入的位置(0到链表长度之间)和元素");
scanf("%d%d",&x,&y);
InsertItem(head,x,y);
break;
case 9:
printf("删除元素\n请输入删除元素的位置(1到链表长度之间)");
scanf("%d",&x);
printf("删除的元素为%d",deleteItem(head,x));
break;
case 10:
printf("按序号查找\n请输入要查找的序号\n");
scanf("%d",&x);
printf("找到的值为%d",FindByNo(head,x));
break;
case 11:
printf("清空链表\n");
FlushLink(head);
break;
case 12:
printf("销毁链表\n");
DestoryLink(head);
break;
case 13:
Print_Node(head);
break;
case 14:
printf("Exit!");
goon = 0;
break;
default:
break;
}
}
}
C语言单链表的实现的更多相关文章
- C语言单链表实现19个功能完全详解
谢谢Lee.Kevin分享了这篇文章 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将 ...
- C语言—单链表
单链表操作:读取,插入和删除 #include "stdafx.h" #include <string.h> #include <stdio.h> #inc ...
- C语言——单链表初始化、求表长、读表元素、插入元素
头文件Linear.h // 单链表的类型定义 typedef struct node { int data; // 数据域 struct node *next; // 指针域 }Node, *Lin ...
- c语言-单链表(二)
继续复习链表知识点,本章包含单链表的增加,删除,判断是否为空,和链表长度,以及链表的排序 几个知识点 1.链表的判断是否为空 //1.判断链表是否为空 bool isempty_list(PNODE ...
- c语言单链表实现
/************************************************************************* > File Name: singleLin ...
- c语言-单链表(一)
定义节点: typedef struct Node { int data; Node* pNext; }NODE, *PNODE; 细节说明,PNode 就代表struct Node* ,上面的表单是 ...
- 零基础玩转C语言单链表
下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...
- c语言——单链表分拆——头插法创建链表,尾插法生成链表
#if 1 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; ...
- C语言单链表简单实现(简单程序复杂化)
PS: goto还是很好玩的. #include <stdio.h> #include <stdlib.h> typedef struct _node{ int value; ...
随机推荐
- 数组常用API(1)
数组常用API: 1. push 作用:数组尾部添加: 特点:可以添加一个或多个值: 返回值是数组最新的长度:会改变原数组: 示例: var arr = [10,20,30,40]; ...
- 原生JS和jQuery中基本的节点操作
js中节点操作**document.createElement()**用来生成网页元素节点,参数为元素的标签名: **document.createTextNode()**用来生成文本节点,参数为所要 ...
- MyBatis二级缓存配置
正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 Mybatis二级缓存是SessionFactory,如果两次查询基于同一个SessionFactory,那么就从二级缓存 ...
- HTTP2 Sampler for JMeter
今天开发大大说能不能帮忙压一下HTTP2的链接,便去查了一下相关的东西. HTTP 2.0 的出现,相比于 HTTP 1.x ,大幅度的提升了 web 性能.在与 HTTP/1.1 完全语义兼容的基础 ...
- js 阻止元素发生默认的行为ie兼容
//亲测ie9可以兼容 function Go(event) { var e = event; if (e && e.preventDefault) { e.preventDefaul ...
- Avito Cool Challenge 2018-B. Farewell Party(思维)
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- (转)Nginx的https配置记录以及http强制跳转到https的方法梳理
Nginx的https配置记录以及http强制跳转到https的方法梳理 原文:http://www.cnblogs.com/kevingrace/p/6187072.html 一.Nginx安装(略 ...
- HttpListener Start 拒绝访问
HttpListener Start 拒绝访问 以管理员权限运行cmd 输入: netsh http add urlacl url=http://127.0.0.1:8080/ user=HuQing
- 关于office转换成pdf组件服务中的DCOM配置问题
在开始->运行 中录入“dcomcnfg” 单击“确定”后弹出“组件服务”窗口 依次选择“组件服务”->“计算机”->“我的电脑”->“DCOM配置” 在“DCOM配置”下找到 ...
- 时间日期相关:Date类、DateFormat类、Calendar类
1 Date类 类 Date 表示特定的瞬间,精确到毫秒. 1秒=1000毫秒 毫秒的0点:公元1970年 一月一日,午夜0:00:00 对应的毫秒值就是0 时间和日期的计算,必须依赖毫秒值. Sys ...