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();
    		}
    	}
    
    }
    
  • 相关阅读:
    Android 按键消息处理Android 按键消息处理
    objcopy
    SQLite多线程读写实践及常见问题总结
    android动画坐标定义
    Android动画效果translate、scale、alpha、rotate
    Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)
    Flatten Binary Tree to Linked List
    Distinct Subsequences
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/6688554.html
Copyright © 2011-2022 走看看