线性表的链式存储结构

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

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

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

}

 

posted @ 2017-04-10 13:10  晓乎  阅读(408)  评论(0编辑  收藏  举报
总访问: counter for blog 次