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; ...
随机推荐
- Codevs 1688 求逆序对(权值线段树)
1688 求逆序对 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给定一个序列a1,a2,…, ...
- hdu1693Eat the Trees(插头dp)
传送门 先坑着,等啥时候会了再来填坑 不得不说思路真的是很妙啊 //minamoto #include<iostream> #include<cstdio> #include& ...
- python——函数重点总结
参数的分类 形参:位置参数.默认参数.*args.命名关键字参数.**kwargs 实参:位置参数.关键字参数 命名关键字参数:定义在*后面的位置参数和默认参数叫作命名关键字参数:用来限制实参必须以关 ...
- 全功能Python测试框架:pytest
python通用测试框架大多数人用的是unittest+HTMLTestRunner,这段时间看到了pytest文档,发现这个框架和丰富的plugins很好用,所以来学习下pytest. imag ...
- Node.js 第三方包的安装、升级、卸载,以及包依赖管理
本地安装: npm install package-name 全局全装: npm install -g package-name 举个栗子 全局安装 React项目的脚手架 npm install ...
- POJ3178 计算几何+DP
//一些点一些圆,过圆不能连线,相邻点不能连线,问最多连几条线 //计算几何模板+区间dp //关键是判断圆和线段是否相交 #include <cstdio> #include <c ...
- NET Core中使用Apworks
NET Core中使用Apworks HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式,在API中引入超链接特性,使得AP ...
- CellSet 遍历
CellSet 结构: 查询MDX: SELECT NON EMPTY {{ {{ {{ {{ {{ AddCalculatedMembers([店铺.店铺ID].[店铺ID].Members)}} ...
- 如何使用Spring Security手动验证用户
1.概述 在这篇快速文章中,我们将重点介绍如何以编程方式在Spring Security和Spring MVC中设置经过身份验证的用户. 2. Spring Security 简而言之,Spring ...
- CI框架自带的验证工具及汉化
本人自己还是很喜欢CI框架自带的验证工具的,使用方式如下: /** *@blog<http://www.phpddt.com> */ public function do_login() ...