数据结构与算法(C++版本)-链表

单链表的反转

将学生成绩程序中的学生成绩结点按照座号反向输出

 1 #include<iostream>
 2 #include<iomanip>
 3 #include<ctime>
 4 #include<cstdlib>
 5 using namespace std;
 6 class list
 7 {
 8 public:
 9     int num,score;
10     char name[10];
11     class list *next;
12 };
13 typedef class list node;
14 typedef node *link;
15 int main()
16 {
17     link ptr,last,before;
18     int i,j,findword = 0,data[12][2];
19     char namedata[12][10] = {{"Allen"},{"Mako"},{"Lean"},{"Melissa"},{"Angle"},{"Sabrina"},{"Joyce"},{"Jasica"},{"Hanson"},
20     {"Amy"},{"Bob"},{"Jack"}};
21     srand((unsigned)time(NULL));
22     for(i = 0;i < 12;i++)
23     {
24         data[i][0] = i + 1;
25         data[i][1] = rand()%50 + 51;
26     }
27     link head = new node;
28     if(!head)
29     {
30         cout << "Error!!内存地址申请失败!!" << endl;
31         exit(1);
32     }
33     head->num = data[0][0];
34     for(j = 0;j < 10; j++)
35         head->name[j] = namedata[0][j];
36     head->score = data[0][1];
37     head->next = NULL;
38     ptr = head;
39     for(i = 1;i < 12;i++)
40     {
41         link newnode = new node;
42         newnode->num = data[i][0];
43         for(j = 0;j < 10; j++)
44             newnode->name[j] = namedata[i][j];
45         newnode->score = data[i][1];
46         newnode->next = NULL;
47         ptr->next = newnode;
48         ptr = ptr->next;
49     }
50     ptr = head;
51     i = 0;
52     cout << "原始表资数" << endl;
53     while(ptr != NULL)
54     {
55         cout << "[" << setw(2) << ptr->num << setw(8)
56             << ptr->name << setw(3) << ptr->score << "] -> ";
57         i++;
58         if(i >= 3)
59         {
60             cout << endl;
61             i = 0;
62         }
63         ptr = ptr->next;
64     }
65     ptr = head;
66     before = NULL;
67     cout << "\n反转后表数据" << endl;
68     while(ptr != NULL)
69     {
70         last = before;
71         before = ptr;
72         ptr = ptr->next;
73         before->next = last;
74     }
75     ptr = before;
76     while(ptr != NULL)
77     {
78         cout << "[" << setw(2) << ptr->num << setw(8)
79             << ptr->name << setw(3) << ptr->score << "] -> ";
80         i++;
81         if(i > 3)
82         {
83             cout << endl;
84             i = 0;
85         }
86         ptr = ptr->next;
87     }
88     system("pause");
89 }

单链表的连接

将学生成绩程序中的学生成绩与新的学生成绩表连接起来

  1 #include<iostream>
  2 #include<iomanip>
  3 #include<ctime>
  4 #include<cstdlib>
  5 using namespace std;
  6 class list
  7 {
  8 public:
  9     int num,score;
 10     char name[10];
 11     class list *next;
 12 };
 13 typedef class list node;
 14 typedef node *link;
 15 link concatlist(link,link);
 16 int main()
 17 {
 18     link head,ptr,newnode,last,before;
 19     link head1,head2;
 20     int i,j,findword = 0,data[12][2];
 21     char namedata1[12][10] = {{"Allen"},{"Scott"},{"Marry"},{"Jon"},{"Mark"},{"Ricky"},{"Lisa"},{"Jasica"},{"Hanson"},
 22     {"Amy"},{"Bob"},{"Jack"}};
 23     char namedata2[12][10] = {{"May"},{"John"},{"Michael"},{"Andy"},{"Tom"},{"Jane"},{"Yoko"},{"Axel"},{"Alex"},
 24     {"Judy"},{"Kelly"},{"Lucy"}};
 25     srand((unsigned)time(NULL));
 26     for(i = 0;i < 12;i++)
 27     {
 28         data[i][0] = i + 1;
 29         data[i][1] = rand()%50 + 51;
 30     }
 31     head1 = new node;
 32     if(!head1)
 33     {
 34         cout << "Error!!内存地址申请失败!!" << endl;
 35         exit(1);
 36     }
 37     head1->num = data[0][0];
 38     for(j = 0;j < 10; j++)
 39         head1->name[j] = namedata1[0][j];
 40     head1->score = data[0][1];
 41     head1->next = NULL;
 42     ptr = head1;
 43     for(i = 1;i < 12;i++)
 44     {
 45         newnode = new node;
 46         newnode->num = data[i][0];
 47         for(j = 0;j < 10; j++)
 48             newnode->name[j] = namedata1[i][j];
 49         newnode->score = data[i][1];
 50         newnode->next = NULL;
 51         ptr->next = newnode;
 52         ptr = ptr->next;
 53     }
 54     srand((unsigned)time(NULL));
 55     for(i = 0;i < 12;i++)
 56     {
 57         data[i][0] = i + 13;
 58         data[i][1] = rand()%40 + 41;
 59     }
 60     head2 = new node;
 61     if(!head2)
 62     {
 63         cout << "Error!!内存地址申请失败!!" << endl;
 64         exit(1);
 65     }
 66     head2->num = data[0][0];
 67     for(j = 0;j < 10; j++)
 68         head2->name[j] = namedata2[0][j];
 69     head2->score = data[0][1];
 70     head2->next = NULL;
 71     ptr = head2;
 72     for(i = 1;i < 12;i++)
 73     {
 74         newnode = new node;
 75         newnode->num = data[i][0];
 76         for(j = 0;j < 10; j++)
 77             newnode->name[j] = namedata2[i][j];
 78         newnode->score = data[i][1];
 79         newnode->next = NULL;
 80         ptr->next = newnode;
 81         ptr = ptr->next;
 82     }
 83     i = 0;
 84     ptr = concatlist(head1,head2);
 85     cout << "两个链表相连的结果" << endl;
 86     while(ptr != NULL)
 87     {
 88         cout << "[" << ptr->num << " " << ptr->name << " " << ptr->score << " ]\t-> ";
 89         i++;
 90         if(i >= 3)
 91         {
 92             cout << endl;
 93             i = 0;
 94         }
 95         ptr = ptr->next;
 96     }
 97     delete newnode;
 98     delete head2;
 99     system("pause");
100     return 0;
101 }
102 link concatlist(link ptr1,link ptr2)
103 {
104     link ptr;
105     ptr = ptr1;
106     while(ptr->next != NULL)
107         ptr = ptr->next;
108     ptr->next = ptr2;
109     return ptr1;
110 }

时间: 2024-12-19 15:11:06

数据结构与算法(C++版本)-链表的相关文章

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

数据结构与算法JavaScript (三) 链表

数据结构与算法JavaScript (三) 链表 我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于 javascript的解释器针对数组都做了直接的优化,不会存在在很多编程语言中数组固定长度的问题(当数组填满后再添加就比较困难了,包括添加删除, 都是需要把数组中所有的元素全部都变换位置的,javascript的的数组确实直接给优化好了,如 push,pop,shift,unshift,split方法等等…) 线性表的顺序

数据结构与算法JavaScript描述——链表

1.数组的缺点 数组不总是组织数据的最佳数据结构,原因如下. 在很多编程语言中,数组的长度是固定的,所以当数组已被数据填满时,再要加入新的元素就会非常困难. 在数组中,添加和删除元素也很麻烦,因为需要将数组中的其他元素向前或向后平移,以反映数组刚刚进行了添加或删除操作. 然而,JavaScript 的数组并不存在上述问题,因为使用splice() 方法不需要再访问数组中的其他元素了. JavaScript 中数组的主要问题是,它们被实现成了对象,与其他语言(比如C++ 和Java)的数组相比,效

数据结构与算法(c++)——反转链表

算法概述:要求实现将一条单向链表反转并考虑时间复杂度. 算法分析: 数组法(略): 将列表元素逐个保存进数组,之后再逆向重建列表 点评:实现逻辑最简单,需要额外的内存开销. 移动指针: 通过三个指针逐个从链表头开始逐一反转链表元素的指针 点评:不需要额外的内存开销,会改变原始链表. 递归: 以递归的方式首先找到链表尾部,再逐一反转指针 点评:不需要额外的内存开销,不会改变原始链表. 算法实现: 构建链表结构 /* 节点结构 */ struct NODE { int data; struct NO

数据结构与算法(三)--单向链表

有的时候,处于内存中的数据并不是连续的.那么这时候,我们就需要在数据结构中添加一个属性,这个属性会记录下面一个数据的地址.有了这个地址之后,所有的数据就像一条链子一样串起来了,那么这个地址属性就起到了穿线连结的作用. 相比较普通的线性结构,链表结构的优势是什么呢?我们可以总结一下: (1)单个节点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小 (2)节点的删除非常方便,不需要像线性结构那样移动剩下的数据 (3)节点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的

数据结构和算法之单向链表二:获取倒数第K个节点

我们在做算法的时候或多或少都会遇到这样的问题,那就是我们需要获取某一个数据集的倒数或者正数第几个数据.那么今天我们来看一下这个问题,怎么去获取倒数第K个节点.我们拿到这个问题的时候自然而然会想到我们让链表从末尾开始next   K-1 次不就是第K-1个节点了么,但是必须要注意一点,这是单向链表.那么这时候的解决思路或许就会出现分歧,大多数人都会想到我们遍历一下链表,获取链表的长度,然后再减去 K 长度的节点,那么我们这个链表的最后一个节点就是原链表的倒数第K个节点:我们看一下实现代码: /**

数据结构和算法之单向链表六:链表的反转以及链表节点的删除

在前面介绍了关于链表的一系列问题,这里我们在介绍一下关于单向链表的反转这个比较具有代表性的算法.在进行反转的时候一定要记住多画图,多去理解在链表进行反转的时候它对于地址的改变,这和数组的数据对换具有很大的不一致. public Node reverseList(Node head){ //判断链表是否为空或者只有一个节点 if(head == null || head.next == null){ return head; } //准备三个节点 Node next = null;//保存当前节点

数据结构与算法 顺序表 链表

内存 计算机的作用 用来存储和运算二进制的数据 衡量计算机内存大小的单位: bit(位): 字节:8bit kb:1024字节 mb:1024kb 问题:计算机如何计算1+2? 必须先在计算机的内存开辟内存空间 才将对应的数值存储到该内存中 变量的概念 a = 10 在计算机中表示的含义(内存图) 内存空间开辟好了之后,每一块内存空间都会有两个默认的属性 内存空间的大小:算机内存大小的单位 内存空间的地址:十六进制的数值 地址作用:用来定位(追踪)指定内存空间,就可以获取该内存空间中存储的数据

数据结构与算法学习-单向链表的实现

链表(Chain本文所说链表均为单向链表,以下均简称单向链表)实际上是由节点(Node)组成的,一个链表拥有不定数量的节点.而向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的. 节点(Node)是由一个需要储存的对象及对下一个节点的引用组成的.也就是说,节点拥有两个成员:储存的对象.对下一个节点的引用. 这样说可能大家不是很明白,我贴一张图大家可能更容易理解. package LinkedList; /** * <p><strong>

数据结构与算法系列:链表

链表定义: 1 // 链表结点 2 struct ListNode 3 { 4 int m_nValue; 5 ListNode* m_pNext; 6 }; 常见问题: #include <iostream> #include <stack> // 输入数据 int Read() { int value; std::cin >> value; return value; } // 创建链表 ListNode* CreateList(int nLen) { ListNo