单链表的创建以及功能的实现

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef int DataType;
typedef struct node{/*结点类型定义*/
    DataType data;/*结点的数据域*/
    struct node *next;/*结点的指针域*/
}ListNode,*LinkList;
ListNode *p;
LinkList head;
/*注意:定义结点结构时,有几点需要注意:LinkList和ListNode *是不同名字的同一个指针类型,LinkList类型的指针变量head表示他是单链表的头指针,ListNode *类型的指针变量p表示它是指向某一结点的指针*/
LinkList InitList()
{
    LinkList L;
    L=(ListNode*)malloc(sizeof(ListNode));
    if(L==NULL)
    {
        printf("分配空间失败!");
        exit(1);
    }
    L->next=NULL;
    return L;
}
LinkList CreatListF()
{/*头插法建立单链表*/
    DataType x;
    LinkList L;
    ListNode *s;
    L=(ListNode *)malloc(sizeof(ListNode));/*头结点*/
    if(L==NULL)/*检查L是否分配到储存空间*/
    {
        printf("分配空间失败!");
        exit(1);
    }
    L->next=NULL;
    scanf("%d",&x);
    while(x!=0)
    {
        s=(ListNode *)malloc(sizeof(ListNode));/*为新插入的结点申请空间*/
        if(s==NULL)
        {
            printf("分配空间失败!");
            exit(1);
        }
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}
LinkList CreatListL()
{/*尾插法建立单链表*/
    DataType x;
    LinkList L=(ListNode *)malloc(sizeof(ListNode));/*头结点*/
    if(L==NULL)
    {
        printf("分配空间失败!");
        exit(1);
    }
    ListNode *s,*r;
    r=L;
    scanf("%d",&x);
    while(x!=0)/*以0输入表示结束*/
    {
        s=(ListNode *)malloc(sizeof(ListNode));/*为新插入的结点申请空间*/
        if(s==NULL)
        {
            printf("分配空间失败!");
            exit(1);
        }
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;/*单链表的最后一个指针为空*/
    return L;
}
int GetLength(LinkList L)
{
    int num=0;
    ListNode *p;
    p=L->next;
    while(p!=NULL)
    {
        num++;
        p=p->next;
    }
    return(num);
}
ListNode *GetNode(LinkList L,int i)
{
    int j=1;
    ListNode *p;
    if(i<1||i>GetLength(L))
    {
        printf("查找的位置不正确!");
        exit(1);
    }
    p=L->next;
    while(p!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    return p;
}
int LocateListi(LinkList L,DataType x)
{
    ListNode *p=L->next;
    int i=1;
    while(p!=NULL&&p->data!=x)
    {
        p=p->next;
        i++;
    }
    if(p==NULL)
        return 0;
    else
        return i;
}
void InsertList(LinkList L,DataType x,int i)
{
    ListNode *p,*q,*s;
    int j=1;
    p=L;
    if(i<1||i>GetLength(L)+1)
    {
        printf("插入位置不正确!");
        exit(1);
    }
    s=(ListNode *)malloc(sizeof(ListNode));
    if(s==NULL)
    {
        printf("分配空间失败!");
        exit(1);
    }
    s->data=x;
        while(j<=i)
        {
            q=p;
            p=p->next;
            j++;
        }
        s->next=p;
        q->next=s;
}
void DeleteList(LinkList L,int i)
{
    ListNode *p,*q;
    int j=1;
    p=L;
    if(i<1||i>GetLength(L))
    {
        printf("删除位置不正确!");
        exit(1);
    }
    while(j<i)
    {
        p=p->next;
        j++;
    }
    q=p->next;
    p->next=q->next;
    free(q);
}
void PrintList(LinkList L)
{
    ListNode *p;
    p=L->next;
    printf("链表元素如下:\n");
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
int main()
{
    DataType a;
    head=InitList();
    printf("我们将采用头插法创建一个单链表L!\n请输入您要输入的数据(以空格隔开,以0结束!)\n");
    head=CreatListL();
    printf("单链表的长度为:%d\n",GetLength(head));
    printf("请输入您要查找元素的结点序号:");
    scanf("%d",&a);
    printf("第%d个元素为:%d\n",a,GetNode(head,a)->data);
    printf("请输入您要查找的元素:");
    scanf("%d",&a);
    printf("您查找的元素%d在链表中的第%d个位置\n",a,LocateListi(head,a));
    int x,i;
    printf("请输入您要插入元素的数值以及位置:");
    scanf("%d%d",&x,&i);
    InsertList(head,x,i);
    PrintList(head);
    printf("请输入您想要删除元素的位置:");
    scanf("%d",&i);
    DeleteList(head,i);
    PrintList(head);
    return 0;
}

原文地址:https://www.cnblogs.com/nyist0/p/8527169.html

时间: 2024-11-09 03:11:39

单链表的创建以及功能的实现的相关文章

(转载)C语言单链表实现19个功能完全详解

最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能.到目前我只写了一半,先传上来,大家有兴趣的可以帮忙指正,谢谢 在vs2010上面编译运行无错误. 每天都会把我写的新代码添加到这个里面.直到此链表完成. #include "stdafx.h" #include "stdio.h" #include <stdlib.h> #in

单链表 初始化 创建 头插法 尾插法 插入 删除 查找 合并 长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(LNode) #

单链表的创建算法

单链表的创建算法 当一个序列中只含有指向它的后继结点的链接时,就称该链表为单链表. 单链表的示意图如下: Head指针为单链表的头指针,单链表L:L既是单链表的名字,也是其头指针.链表中的最后一个结点的指针域定义为空指针(NULL). 单链表的定义: struct Node { ElemType data; struct Node *next; }; typedef struct Node LNode; typedef struct Node *LinkedList; 单链表有带头结点和不带头结

C++单链表的创建与操作

链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素.链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点.Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束.可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的地址.结点中只有一个next指针的链表称为单链表,这是最简单的链表结构. 首先定义一个

C语言单链表实现19个功能完全详解

#include "stdafx.h" #include "stdio.h" #include <stdlib.h> #include "string.h" typedef int elemType ; /************************************************************************/ /* 以下是关于线性表链接存储(单链表)操作的18种算法 */ /* 1.初始化线性

华南理工数据结构大作业第一题单链表 删除创建等各种简易操作

#include<iostream> #include<windows.h> #include<string> /* (1) 初始化单链表h: (2) 依次插入5个元素:{"张三" , 85}, {"李四" , 95}, {"王五" , 75}, {"陈军" , 80}, {"程涛" , 90} (3) 输出单链表h的内容: (4) 输出单链表的长度: (5) 输出单链表

C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这时候加上一篇. 在此之前,我们先谈一下我要说的一些基本知识: ①函数参数为什么是双指针? 我们先写一下这么一个程序: # include<stdio.h>void Gai(int m){ m=5;}int main(void){ int a=1; Gai(a); printf("%d\n&

单链表的创建,插入,删除,遍历

1 #include<stdio.h> 2 #include<iostream> 3 #include<malloc.h> 4 #define OK 1 5 #define ERROR 0 6 using namespace std; 7 typedef struct LNode 8 { 9 int data; 10 struct LNode *next; 11 } LNode,*LinkList; 12 13 void Init(LinkList &L)///

单链表的创建--简单

文件结构: //Link.java package LinkList_Node; import java.util.Scanner; public class Link { static node head; static node t; public Link() { head=new node(); } //以下是前插法: public void insertHead(int val) { node cur=new node(val);  //新结点数据域 cur.next=null;