弹出链表的麻烦

时间:2014-02-28 07:00:46

标签: c sorting shellsort

这是针对学校项目的。

我和我的朋友们一直致力于这个具体的项目,并且已经停留了好几天。

我们有这两种结构......

typedef struct node{
  long value;
  struct node *next;
}Node;


typedef struct list{
  Node *Node;
  struct list *next;
  struct list *prev;
}List; 

名为node的结构将是链表本身,我必须将此结构用作链表。

名为List的第二个结构可以是指向节点的指针。

使用第一个结构(和第二个,如果我们这样选择),我们必须对shell(插入风格)排序整数的链接列表。

我们尝试了两种不同的方法,一种方法是通过遍历间隙元素来强制排序,确定是否需要将它们移动到链表的已排序部分中的某个位置,并从头开始遍历链表,直到我们在排序部分找到一个比它大的元素。这有效,但运行时间太长(这是一个数据结构和算法课程,因此我们必须考虑运行时间)。

我们想要实现的方法涉及使用第二个结构指向根据shell排序间隔的元素,然后在间隙序列的链表中对这些值进行排序。

我们知道如何生成序列,但是任何人都可以给我们一些实现算法的技巧吗?

我们已经形成了标准链表。

我们认为我们需要创建一个列表创建函数和一个列表插入函数,但之后我们就失去了如何启动它。

赞赏所有提示和评论!!!!谢谢!

编辑:我不能在这个实现中使用任何数组,该项目是关于链表的分析,并将它们的使用和速度与数组进行比较。

1 个答案:

答案 0 :(得分:0)

我以为我会总结一下评论中所说的内容

1)最初你需要将所有指针放在一个数组中。

struct node* element_pointers[size]

如果您不确定结构将包含多少元素,那么您需要malloc runtim期间的数组

struct node* element_pointer = malloc(sizeof(struct node*)*number_of elements)

2)当试图将指针放入数组时,你有2个选项

您可以在创建每个结构时将指针放在数组中,也可以遍历链表并将每个下一个指针放入数组中。

如果遍历结构,它将成为一个简单的while循环

int i =0;
element_pointer[i++] = head; //the pointer to the Head struct//
while( Head->next != NULL){
    i++;
    element_pointer[i] = Head->next;
    head = head->next}

3)排序指针时。在你的shell-sort函数中。

进行这样的比较

 if(element_pointer[j]->value > element_ponter[j+gap]->value)

//必要时交换

4)交换功能就像这样

struct node *temp = element_pointer[j]
element_pointer[j] = element_pointer[j+gap]
element_pointer[j+gap] = temp.

正如吉姆巴尔特所提到的,你也可以对双重链表进行排序,我在SO上发现了这个 Sorting doubly linked list in c我也需要学习。