线性表的链式存储结构
要求:使用头插法和尾插法来分别创建两个线性表,编程实现单链表的查找、插入和删除操作的算法。
首先引入头文件,定义结构体:
1 2 3 4 5 6 7 8 9 10 11 | #include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef int ElemType; //定义节点类型 typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; |
(1)、创建链表
头插法:链表的逻辑顺序与结点的插入顺序相反,即逆序。从一个空表开始,反复的读入数据,生成结点放到链表中,注意这里是插入到当前链表的表头之后,如下图:
创建方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //单链表的建立(头插法建立) 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使其一直指向当前链表的尾结点。如图
创建方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //单链表的建立(尾插法建立) 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)、单链表的元素获取操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //获取单链表中位置为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)、单链表的元素查找操作(即定位其索引)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //查找元素,当线性表中存在的值与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)、单链表的插入操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | //单链表的插入操作 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)、单链表的删除操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //单链表的删除操作 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; } |
主程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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版线性表如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | 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(); } } } |
很希望自己是一棵树,守静、向光、安然,敏感的神经末梢,触着流云和微风,窃窃的欢喜。脚下踩着最卑贱的泥,很踏实。还有,每一天都在隐秘成长。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
· 用99元买的服务器搭一套CI/CD系统
· Excel百万数据如何快速导入?
· ShadowSql之.net sql拼写神器