线性表的链式存储结构

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

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

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)、创建链表

头插法:链表的逻辑顺序与结点的插入顺序相反,即逆序。从一个空表开始,反复的读入数据,生成结点放到链表中,注意这里是插入到当前链表的表头之后,如下图:

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

创建方法如下:

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使其一直指向当前链表的尾结点。如图

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

创建方法如下:

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();
        }
    }
 
}

 

posted @   晓乎  阅读(414)  评论(0编辑  收藏  举报
编辑推荐:
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
阅读排行:
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
· 用99元买的服务器搭一套CI/CD系统
· Excel百万数据如何快速导入?
· ShadowSql之.net sql拼写神器
总访问: counter for blog 次
点击右上角即可分享
微信分享提示