创建单线性链表的不同表示方法和操作

创建单线性链表,常见的有头插法、尾插法创建线性链表,常见的操作有:创建链表、查找、删除、添加元素、求逆链等操作。

这里首先用头插法创建链表:

//头指针唯一确定一个单链表

  #define MaxSize 15
   typedef int elem_type ;
   typedef struct linklist
   {
     elem_type data;
     struct linklist *next;
   } Linklist;

  //头插入法建立链表:每次将头结点的指针赋值给新结点,然后将新节点赋值给头结点指针
      Linklist *CreateList ()
      {
        Linklist *head,*p;
        head =(Linklist *)malloc(sizeof(Linklist));
		head->next=NULL;
       // p =(Linklist *)malloc(sizeof(Linklist));

		int i;
		cout<<"随机产生一个数字:"<<endl;
        for(i=0;i<MaxSize;i++)
        {
          int data;
          data =rand()%100;
		  p =(Linklist *)malloc(sizeof(Linklist));

		  cout<<"第"<<i<<"个数是"<<data<<endl;
          p->data =data;
          p->next=head->next;
          head->next=p;
        }
       return head;
      }

//利用头插法创建的链表有什么特点呢?

这里能够写个查找函数来说明:

定义一个查找函数:

//查找(取出第i个数的值)
  elem_type Get_Elem(Linklist *L, int i)
{
   int j;
   Linklist *p;
   p=L->next;
   if((i>MaxSize) && (i< 0))
     cout<<"输入有效的i值";
   for(j=0;j<i-1;j++)
       {
		   p=p->next;
     	//flag->next++;  //链表不是矩阵。指针自加1不是指向下一个结点,那是矩阵里能够这样。
     	}
   return p->data;
}

编译一下:结果例如以下

//主函数例如以下:

int main()
{
  Linklist *Q;
  Q=CreateList();
  int i;
  cout<<"输入想要查找的元素号i=";
  cin>>i;
  int getNum = Get_Elem( Q , i);
  cout<<"第"<<i<<"个元素是"<<getNum<<endl;

  //Insert_Elem(Q, 3,5);
  while(1);
  return 0;
}

依据执行结果可知道:对于头插法,输入的结点次序和生成的链表次序相反。

还有能够有:删除元素和增添元素的函数体:

//删除链表中的某个结点
void Delete_Linklist(Linklist *L,elem_type i)
  {
  	Linklist *p,*q;
  	p=L->next;
  	int j=0;
  	if(i<0 && i>MaxSize )
  		cout<<"j输入有效的i值";
  	else
  		{
  			while((p->next != NULL)&&(j<i-1))
  			{
  				p=p->next;  //寻找第i个结点
  				++j;
  				}
  			 q=p->next;
  			 p->next=q->next;
  			 free(q);
  		}
  }

//加入结点(在第i个节点处加入一个值)
 void Insert_Elem(Linklist *L, int i, elem_type Number)
{
   int j;
   Linklist *p,*q;
   p=L->next;
   if((i>MaxSize) && (i< 0))
     cout<<"输入有效的i值";
   for(j=0;j<i-1;j++)
       {
		   p=p->next;
     	//flag->next++;  //链表不是矩阵,指针自加1不是指向下一个结点。那是矩阵里能够这样。

}
   if(i==j+1)
     {
		q=(Linklist *)malloc(sizeof(Linklist));
     	q->data=Number;
     	q->next=p->next;
     	p->next=q;
     	}
  //  return p;
}

问题分析:为什么头插法的数据元素顺序和链表中结点顺序相反?

循环第一次时:

          p->data =data;          //数据元素第一次赋值
          p->next=head->next;    //循环赋值。第一次将NULL赋给p->next,
          head->next=p;         //第一次赋值后的p赋给head->next;

循环第二次时:

          p->data =data;         //数据元素第二次赋值
          p->next=head->next;    //循环赋值,第二次将 (第一次赋值后的<span style="font-family: Arial, Helvetica, sans-serif;">head->next</span><span style="font-family: Arial, Helvetica, sans-serif;">)赋给p->next,</span>
          head->next=p;         //第二次赋值后的p赋给head->next;

所以新赋值进来的结点更靠近head->next.

时间: 2024-10-06 00:23:04

创建单线性链表的不同表示方法和操作的相关文章

创建单链表

还记得创建单链表的这些代码还是大学时候写过,现在再重新写一写,为面试做准备吧: 创建单链表的两种形式:头插法和尾插法 // 演示创建2种单链表的方式 // [C++基础]单链表.cpp #include "stdafx.h" #include <iostream> using namespace std; struct link { int data; link *next; }; //头插法建立单链表 link *creatLink_head(link *head) {

【数据结构】线性链表(单链表)

// // main.cpp // LinkList // // Created by T.P on 2019/1/31. // Copyright ? 2019 T.P. All rights reserved. // #include <stdio.h> #include <stdlib.h>//malloc free #define TRUE 1 #define FALSE 0 #define OK 0 #define ERROR -1 #define INFEASIBLE

c语言创建单链表

//创建单链表 #include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct Student STU; //用typedef 新定义结构体名字为 STU:struct Student //定义时不能直接用STU{ char name[20]; float score; STU* next;// 定义指向结构体的指针}; int main(){ STU a, b, c, *P, *head; 

线性链表其他种类(静态,双向,循环)的存储结构和常见操作

一.静态单链表 在不支持动态空间分配的环境中,要使用链表存储数据,那么可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针链来构成链式结构. //既然是静态链表,那么可以使用一维数组实现存储,java没有指针,那么就用这来使用链表结构 //在不支持动态空间分配的环境中,要使用链式结构技术,可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针. //存储结构:在数组中增加一个“指针”域,存放下一元素在数组中的下标.且0为代表空指针 //设S为SLinkList型变量,若第i

线性链表的双向链表——java实现

.线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为null. 循环链表:一种首尾相连的链表. 双向链表:每个节点有两个引用,一个指向当前节点的上一个节点,另外一个指向当前节点的下一个节点. 下面给出线性表双向链表的实现:java中LinkedList是线性表的链式实现,是一个双向链表. import java.util.NoSuchElementE

数据结构 线性链表

//线性链表头文件 #ifndef _vzhanglinklist #define _vzhanglinklist typedef struct _LinkNode{ struct _LinkNode *pnext; }LinkNode; typedef void LinkList; //创建线性链表 _declspec(dllexport) LinkList* LinkList_Create(); //销毁线性链表 _declspec(dllexport) int LinkList_Destr

iOS:创建单例对象的两种方式

单例模式:创建单例对象的两种方式 方式一:iOS4版本之前 static SingleClassManager *singleManager = nil; +(SingleClassManager*)sharedManager { @synchronized(self)  //同步加锁,在多线程中使用,可以使线程安全 { if(singleManager == nil) { singleManager = [[SingleClassManager alloc]init]; } } return

数据结构C语言实现——线性链表

declaration.h #ifndef DECLARATION_H_INCLUDED #define DECLARATION_H_INCLUDED #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define ElemType int typedef ElemType* Triplet; typedef int Status; type

从新定义线性链表及其基本操作

链表在空间的合理利用上和插入.删除时不需要移动等优点,因此在很多场合下,它是线性表的首先储存结构.然而它也存在着实现某些基本操作,如求线性表的长度时不如顺序储存结构的特点.因而从新定义线性链表及其基本操作 头文件: #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define MYOVERFLOW -2 typedef int Status; typedef int Elemty