- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 C
中打乱链表。我正在考虑通过遍历整个列表来做到这一点,对于每个对象,我将尝试随机化一个索引并在它们之间交换。代码似乎可以正常工作,但运行代码几次后,列表的一部分似乎消失了,有时我会被踢出应用程序。
代码如下:
void main() {
Song* head = createSong(1, "aaaa", "aaaa");
Song* song2 = createSong(2, "bbbb", "bbbb");
Song* song3 = createSong(3, "cccc", "cccc");
addSongToTheEndOfTheList(head, song2);
addSongToTheEndOfTheList(head, song3);
printPlaylist(head);
shuffleList(head);
printPlaylist(head);
//freePlaylist(head);
}
int countList(Song* head) {
Song* currentSong = head;
int i = 0;
if (currentSong)
{
while (currentSong->next)
{
currentSong = currentSong->next;
i++;
}
i++;
}
return i;
}
void swapSong(Song* head,Song* Source, int id) {
Song* tempSong = (Song*)malloc(sizeof(Song));
Song* currentSong = head;
while(currentSong && currentSong->id != id){
currentSong = currentSong->next;
}
if (currentSong) {
tempSong->id = currentSong->id;
tempSong->name = currentSong->name;
tempSong->artist = currentSong->artist;
tempSong->next = currentSong->next;
currentSong->id = Source->id;
currentSong->name = Source->name;
currentSong->artist = Source->artist;
currentSong->next = Source->next;
Source->id = tempSong->id;
Source->name = tempSong->name;
Source->artist = tempSong->artist;
Source->next = tempSong->next;
free(tempSong);
}
else {
printf("The list is empty.");
}
}
void shuffleList(Song* head) {
Song* currentSong = head;
int listLength = countList(head);
int randNum;
srand(time(NULL));
if (currentSong) {
for (int i = 1; currentSong;i++) {
swapSong(head, currentSong, rand()%listLength+1);
currentSong = currentSong->next;
}
}
else {
printf("The list is empty.");
}
}
完整代码在这里: https://pastebin.com/fSS3rrTv
希望你能帮我弄清楚。谢谢!
最佳答案
错误在swapSong
。有两种可能的方式来交换列表中的元素:
next
指针前者对于内部数据很少的单链表更简单(这是您的用例),后者更适用于双向链表。
这里只要将swapSong
改成:
void swapSong(Song* head,Song* Source, int id) {
Song* tempSong = (Song*)malloc(sizeof(Song));
Song* currentSong = head;
while(currentSong && currentSong->id != id){
currentSong = currentSong->next;
}
if (currentSong) {
tempSong->id = currentSong->id;
tempSong->name = currentSong->name;
tempSong->artist = currentSong->artist;
//tempSong->next = currentSong->next;
currentSong->id = Source->id;
currentSong->name = Source->name;
currentSong->artist = Source->artist;
//currentSong->next = Source->next;
Source->id = tempSong->id;
Source->name = tempSong->name;
Source->artist = tempSong->artist;
//Source->next = tempSong->next;
free(tempSong);
}
else {
printf("The list is empty.");
}
}
顺便说一句,在 Song
结构中,id
被声明为 int *
,而它被用作 int
。更改为以下内容以删除一些警告:
typedef struct Song {
int id;
char* name;
char* artist;
struct Song* next;
}Song;
正如@500-InternalServerError 所注意到的,您不需要在 swapSong
中分配任何内容:只需使用本地结构:
void swapSong(Song* head,Song* Source, int id) {
Song* currentSong = head;
while(currentSong && currentSong->id != id){
currentSong = currentSong->next;
}
if (currentSong) {
Song tempSong = *currentSong;
currentSong->id = Source->id;
currentSong->name = Source->name;
currentSong->artist = Source->artist;
Source->id = tempSong.id;
Source->name = tempSong.name;
Source->artist = tempSong.artist;
}
else {
printf("The list is empty.");
}
}
关于c - 用指针在c中打乱链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56360545/
我正在使用下面的随机播放脚本来随机化网站上某些 div 的顺序。 http://james.padolsey.com/javascript/shuffling-the-dom/ 该脚本有效,但仅随机化
我想打乱 HashMap 中的值。我有以下类型的 HashMap Map > trainDataSet = new HashMap>(); 我想打乱 map 中的值。我该怎么做呢? 以下是我的尝试:
这个问题已经有答案了: Shuffle a list of integers with Java 8 Streams API (8 个回答) 已关闭 3 年前。 我有一个单词列表:List words
我必须使用 SQL SELECT 语句返回一些结果。我需要返回两条关于员工的信息,Employee# 和 EmployeeName。 我试过了 SELECT Employee#, EmployeeNa
我有一个网页,我正在尝试打印它。我正在使用引导导航栏。问题是,当我使用 bootstarp 导航栏时,打印预览没有任何意义。我在页面中看到了代码行而不是实际内容。只有当我将引用添加到 bootstra
我用 16 位值加载两个 SSE 128 位寄存器。这些值按以下顺序排列: src[0] = [E_3, O_3, E_2, O_2, E_1, O_1, E_0, O_0] src[1] = [E_
我需要做的是:原始状态: 洗牌后: 第一个 div 中的 Divs 留在那里但会被打乱,同样的情况也会发生在具有相同类的第二个 div 中。要在特定的 div
我有一个列表: milk butter eggs orange juice bananas 如何使用 javascript 随机重新排序列表项? 最佳答案
我有一个大小为 n 的 NSMutableArray urlArray,我想从数组中的元素总数中随机选择其中的 4 个 URL。 但是我不想直接打乱 urlArray,我更喜欢制作一个“indexAr
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
首先,我的母语不是英语,所以请原谅我的一些错误。 我想对 ArrayList 进行洗牌(没问题),但是洗牌后列表必须满足某些条件。我的第一个方法是创建 if 语句,并在每次为 true 时进行洗牌。但
我想打乱 __m256i vector 的元素。并且有一个内在的 _mm256_shuffle_epi8 做类似的事情,但它不执行跨车道洗牌。 如何使用 AVX2 指令来实现? 最佳答案 有一种方法可
有谁知道改变现有 NSString 或 NSMutableString 字符顺序的现有方法吗?无论如何,我有一个解决方法,但如果有一个现有的方法,那就太好了。 例如,给定字符串@"HORSE",一个方
我是 Objective-C 新手,通过反复试验来学习!如果这个问题有点幼稚,请原谅我。 我创建了一组图像,需要对它们进行随机播放。我已经使用了这里给出的建议: What's the Best Way
我们有一个网络应用程序,希望向潜在客户演示,但我们最好的方法是使用现有数据,以获得完整的体验。当然,我们不想使用应用程序中可见的实际客户名称或地址等来执行此操作。 SQL Server 中有没有一种简
有一个简单的方法来缩小和/或混淆 JS,它存在于我的 django 模板中? 我还在js中使用模板变量和模板标签,因此,标准的uglifyjs或类似的不符合我最初的要求。 有什么事情要做吗? 最佳答案
我是新用户 ArrayList 。我不明白。 如果我使用int[]作为ArrayList项目有错误: The method put(int) is undefined for the type Arr
是否可以随机打乱 Excel 工作表中行或列中的值。有没有相关的函数/宏?我该怎么做? -广告。 最佳答案 嗯...就像简单的解决方案一样,无需编程。例如,您有一列数据 (A): 23 78 12 7
我想打乱我的数组项。像这样: [1,2,3,4].scramble => [2,1,3,4] [1,2,3,4].scramble => [3,1,2,4] [1,2,3,4].scramble =>
我目前正在为 Android 开发内容创建应用程序。它的主要目的是让用户生成一个包含文本和图像条目的列表(最后由 EditText 和 ImageView 表示)。 我通过使用 ViewHolder
我是一名优秀的程序员,十分优秀!