要求:使用头插法和尾插法来分别创建两个线性表,编程实现单链表的查找、插入和删除操作的算法。
首先引入头文件,定义结构体:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
//定义节点类型
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
(1)、创建链表
头插法:链表的逻辑顺序与结点的插入顺序相反,即逆序。从一个空表开始,反复的读入数据,生成结点放到链表中,注意这里是插入到当前链表的表头之后,如下图:
创建方法如下:
//单链表的建立(头插法建立)
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使其一直指向当前链表的尾结点。如图
创建方法如下:
//单链表的建立(尾插法建立)
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();
}
}
}