zoukankan      html  css  js  c++  java
  • 线性表的链式存储结构

    要求:使用头插法和尾插法来分别创建两个线性表,编程实现单链表的查找、插入和删除操作的算法。

    首先引入头文件,定义结构体:

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    typedef int ElemType;
    
    //定义节点类型
    typedef struct LNode
    {
    	ElemType data;
    	struct LNode *next;
    }LNode,*LinkList;
    

    (1)、创建链表

    头插法:链表的逻辑顺序与结点的插入顺序相反,即逆序。从一个空表开始,反复的读入数据,生成结点放到链表中,注意这里是插入到当前链表的表头之后,如下图:

    https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1491810331595&di=c6f953fdbc42fcdb93c14b25d6fb5dd2&imgtype=0&src=http%3A%2F%2Fwww.nowamagic.net%2Flibrarys%2Fimages%2F201209%2F2012_09_12_05.jpg

    创建方法如下:

    //单链表的建立(头插法建立)
    LinkList CreateLinkList_H()
    {
    	LNode *L;
    	ElemType x;
    	//申请头结点的空间
    	L=(LNode *)malloc(sizeof(LNode));
    	L->next=NULL;
    	scanf("%d",&x);
    	while(x!=-1)
    	{
    		LNode *p;
    		p=(LNode *)malloc(sizeof(LNode));//申请新节点的空间
    		p->data=x;
    		p->next=L->next;
    		L->next=p;
    		scanf("%d",&x);
    	}
    	return L;
    }
    

    尾插法:线性表的逻辑顺序与节点的插入顺序相同,将新节点插入到当前链表的链尾上,为此必须加上一个尾指针指针p使其一直指向当前链表的尾结点。如图

    https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1491810662521&di=df51403c99827704f58313578ea97193&imgtype=0&src=http%3A%2F%2Fimg313.ph.126.net%2FDvJQF1dNc0uYnHq0SNI-Hw%3D%3D%2F3664804196773320898.jpg

    创建方法如下:

    //单链表的建立(尾插法建立)
    LinkList CreateLinkList_T()
    {
    	LNode *L,*r,*p;
    	ElemType x;
    	L=(LNode *)malloc(sizeof(LNode));
    	L->next=NULL;
    	r=L;
    	scanf("%d",&x);
    	while(x!=-1)
    	{
    		p=(LNode*)malloc(sizeof(LNode));
    		p->data=x;
    		p->next=r->next;
    		r->next=p;
    		r=p;
    		scanf("%d",&x);
    	}
    	r->next=NULL;
    	return L;
    }
    

     (2)、单链表的元素获取操作

    //获取单链表中位置为i的元素,若找到,则返回1,否则,返回-1
    int GeteElem(LinkList L,int i)
    {
    	LinkList p=L;
    	int j=0;
    	while(p->next && j<i)
    	{
    		p=p->next;
    		j++;
    	}
    	if(j==i)
    		return p->data;
    	else 
    		return -1;
    }
    

    (3)、单链表的元素查找操作(即定位其索引)

    //查找元素,当线性表中存在的值与e相等的时候,返回其位序
    int Locate_L(LinkList L,ElemType e)
    {
    	LinkList p=L->next;
    	int i=1;
    	while(p)
    	{
    		if(p->data==e)
    			return i;
    		else
    			p=p->next;
    		i++;
    	}
    	return -1;
    }
    

     (4)、单链表的插入操作

    //单链表的插入操作
    LinkList insert_seq(LinkList L,ElemType x,int index)
    {
    	LinkList pre=L;
    	LinkList q=L;
    	int i,k=0;
    	//先检查链表的长度
    	while(q)
    	{
    		q=q->next;
    		k++;
    	}
    	if(index<0 || index>k)
    	{
    		printf("输入的位置错误,程序终止
    ");
    		exit(0);	//删除的位置不合理
    	}
    	for(i=1;i<index;i++)
    	{
    		pre=pre->next;
    	}
    	LinkList p=(LNode *)malloc(sizeof(LNode));
    	p->data=x;
    	p->next=pre->next;
    	pre->next=p;
    	return L;
    }
    

     (5)、单链表的删除操作

    //单链表的删除操作
    LinkList ListDelete_L(LinkList L,int index)
    {
    	//在带头结点的单链表L中删除第i个元素,并由e返回其值
    	LinkList p,q;
    	int k=0,j=0;
    	q=L;
    	//先检查链表的长度
    	while(q)
    	{
    		q=q->next;
    		k++;
    	}
    	if(index<0 || index>k)
    		return NULL;	//删除的位置不合理
    	for(p=L;j<index-1&&p->next!=NULL;j++)
    		p=p->next;
    	p->next=p->next->next;
    	
    	return L;
    
    }
    

     主程序:

    void main()
    {
    	LinkList listH,start,listT;
    	ElemType x;
    	int index;
    	printf("使用头插法建立单链表,请输入单链表的元素
    ");
    	listH=CreateLinkList_H();
    	for(start=listH->next;start!=NULL;start=start->next)
    		printf("%d",start->data);
    	printf("
    ");
    	printf("使用尾插法建立单链表,请输入单链表的元素
    ");
    	listT=CreateLinkList_T();
    	for(start=listT->next;start!=NULL;start=start->next)
    		printf("%d",start->data);
    	printf("
    ");
    	printf("请输入要获取线性表中的元素的索引号:(第一个线性表):
    ");
    	scanf("%d",&index);
    	x=GeteElem(listH,index);
    	printf("在线性表中的第%d个位置的元素为:%d
    ",index,x);
    	printf("请输入要查找的元素:");
    	scanf("%d",&x);
    	int location=Locate_L(listH,x);
    	if(location>0)
    		printf("%d元素在第 %d 个位置
    ",x,location);
    	else
    		printf("未找到,线性表中不存在该元素
    ");
    	printf("插入元素:请先输入插入的位置:");
    	scanf("%d",&index);
    	printf("请输入插入的元素:");
    	scanf("%d",&x);
    	listH=insert_seq(listH,x,index);
    	printf("插入后元素如下:
    ");
    	for(start=listH->next;start!=NULL;start=start->next)
    		printf("%d ",start->data);
    	printf("
    请输入要删除元素的位置:");
    	scanf("%d",&index);
    	listH=ListDelete_L(listH,index);
    	printf("删除后元素如下:
    ");
    	for(start=listH->next;start!=NULL;start=start->next)
    		printf("%d ",start->data);
    }
    

      运行截图如下:


    java版线性表如下:

    package com.gqx.linkList;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Random;
    
    class Node{
    	int data;
    	int np;
    	String names;
    	Node next;
    	public Node(int data,int np,String name){
    		this.np=np;
    		this.data=data;
    		this.names=name;
    		this.next=null;
    	}
    }
    public class StuLinkList {
    	public Node first;
    	public Node last;
    	public boolean isEmpty(){
    		return first==null;
    	}
    	public void print(){
    		Node currentnNode=first;
    		while(currentnNode!=null){
    			System.out.print("["+currentnNode.data+" "+currentnNode.names+" "+currentnNode.np+"]");
    			currentnNode=currentnNode.next;
    		}
    		System.out.println();
    	}
    	public void insert(int data,String name,int np){
    		Node newNode=new Node(data, np, name);
    		if (this.isEmpty()) {
    			first=newNode;
    			last=newNode;
    		}else {
    			last.next=newNode;
    			last=newNode;
    		}
    	}
    	public void delete(Node deleteNode){
    		Node newNode;
    		Node temp;
    		if (first.data==deleteNode.data) {
    			first=first.next;
    		}
    		else if (last.data==deleteNode.data) {
    			System.out.println("I am here!");
    			newNode=first;
    			while(newNode.next!=last)
    				newNode=newNode.next;
    			newNode.next=last.next;
    			last=newNode;
    		}else {
    			newNode=first;
    			temp=first;
    			while (newNode.data!=deleteNode.data) {
    				temp=newNode;
    				newNode=newNode.next;
    			}
    			temp.next=newNode.next;
    		}
    	}
    	public static void main(String[] args) throws NumberFormatException, IOException {
    		// TODO Auto-generated method stub
    		BufferedReader buf;
    		Random random=new Random();
    		buf=new BufferedReader(new InputStreamReader(System.in));
    		StuLinkList list=new StuLinkList();
    		int i,j,findword=0,data[][]=new int[6][10];
    		String names[]={"Allen","John","Lisa","Amy","Bob","Jack"};
    		System.out.println("学号成绩!");
    		for (i = 0;  i< names.length; i++) {
    			data[i][0]=i+1;
    			data[i][1]=Math.abs(random.nextInt(50))+50;
    			list.insert(data[i][0], names[i], data[i][1]);
    		}
    		for ( i = 0; i < 3; i++) {
    			for (j = 0; j < 2 ; j++) {
    				System.out.print("["+data[j*3+i][0]+"] ["+data[j*3+i][1]+"] ");
    			}
    			System.out.println();
    		}
    		while (true) {
    			System.out.println("输入要删除成绩的学号:");
    			findword=Integer.parseInt(buf.readLine());
    			if (findword==-1) {
    				break;
    			}else {
    				Node currNode=new Node(list.first.data,list.first.np , list.first.names);
    				currNode.next=list.first.next;
    				while (currNode.data!=findword) {
    					currNode=currNode.next;
    				}
    				list.delete(currNode);
    			}
    			System.out.println("删除后的成绩列表如下:");
    			list.print();
    		}
    	}
    
    }
    
  • 相关阅读:
    【练习】flushback基于时间的闪回查询
    【练习】审计
    【练习】新建虚拟机
    织梦安全防护教程首页被挟持、被串改、被挂马、被入侵之后如何解决?
    织梦手机站下一篇变上一篇而且还出错Request Error!
    织梦图集上传错误提示ERROR: Upload Error!
    织梦炒鸡简单3部曲修改文档标题长度限制
    织梦dede:arclist和dede:list输出每个文章的内容有多少页
    织梦后台管理模板无法正常显示模板文件列表解决方法
    织梦列表页多种属性排序[ajax]-支持select方式和降序升序切换
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/6688554.html
Copyright © 2011-2022 走看看