线性表的链式存储结构
要求:使用头插法和尾插法来分别创建两个线性表,编程实现单链表的查找、插入和删除操作的算法。
首先引入头文件,定义结构体:
#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(); } } }
很希望自己是一棵树,守静、向光、安然,敏感的神经末梢,触着流云和微风,窃窃的欢喜。脚下踩着最卑贱的泥,很踏实。还有,每一天都在隐秘成长。