以下代码块来自实现队列的C ++程序。我知道结构,类和指针等,但我不使用struct很多,所以它让我很难理解*front = NULL,*rear = NULL,*p = NULL,*np = NULL;
的含义。是否声明了这些节点类型指针并将其设置为默认值NULL?如果我错了并请您解释,请纠正我。
struct node
{
int data;
node *next;
}*front = NULL,*rear = NULL,*p = NULL,*np = NULL;

答案 0 :(得分:3)
与
相同val input = sqlContext.createDataFrame(Seq(
Record(1, "Prod_1"),
Record(2, "Prod_1"),
Record(3, "Prod_1"),
Record(4, "Prod_2"),
Record(5, "Prod_3"),
Record(6, "Prod_3"),
Record(7, "Prod_2"),
Record(8, "Prod_3"),
Record(9, "Prod_1"),
Record(10, "Prod_1"),
Record(11, "Prod_4")
))
input.registerTempTable("input")
// Step 1: find "nextShiftId" for each record
val withBlockId = sqlContext.sql(
"""
|SELECT FIRST(a.id) AS id, FIRST(a.productId) AS productId, MIN(b.id) AS nextShiftId
|FROM input a
|LEFT JOIN input b ON a.productId != b.productId AND a.id < b.id
|GROUP BY a.id
""".stripMargin)
withBlockId.show()
// prints:
// +---+---------+-----------+
// | id|productId|nextShiftId|
// +---+---------+-----------+
// | 1| Prod_1| 4|
// | 2| Prod_1| 4|
// | 3| Prod_1| 4|
// | 4| Prod_2| 5|
// | 5| Prod_3| 7|
// | 6| Prod_3| 7|
// | 7| Prod_2| 8|
// | 8| Prod_3| 9|
// | 9| Prod_1| 11|
// | 10| Prod_1| 11|
// | 11| Prod_4| null|
// +---+---------+-----------+
// Step 2: group by "productId" and "nextShiftId"
val resultRdd = withBlockId.rdd
.groupBy(r => (r.getAs[String]("productId"), r.getAs[Int]("nextShiftId")))
// sort by nextShiftId to get the order right before adding index
.sortBy {
case ((prodId, 0), v) => Long.MaxValue // to handle the last batch where nextShiftId is null
case ((prodId, nextShiftId), v) => nextShiftId
}
// zip with index (which would be the "unique id") and flatMap to just what we need:
.values
.zipWithIndex()
.flatMap { case (records, index) => records.map(r => (r.getAs[String]("productId"), index+1))}
// transform back into DataFrame:
val result = sqlContext.createDataFrame(resultRdd)
result.show()
// prints:
// +------+---+
// | _1| _2|
// +------+---+
// |Prod_1| 1|
// |Prod_1| 1|
// |Prod_1| 1|
// |Prod_2| 2|
// |Prod_3| 3|
// |Prod_3| 3|
// |Prod_2| 4|
// |Prod_3| 5|
// |Prod_1| 6|
// |Prod_1| 6|
// |Prod_4| 7|
// +------+---+
答案 1 :(得分:2)
这意味着与此相同:
struct node
{
int data;
node *next;
};
node *front = NULL;
node *rear = NULL;
node *p = NULL;
node *np = NULL;
这绝对不是一种好的风格。
顺便说一句,如果node
是一个类,这也可以。 struct基本上是一个类,默认情况下所有元素都是公共的。
另一个建议:C ++ 11有一个特定的关键字nullptr
用于初始化指针。这更清楚地表达了正在发生的事情。 NULL
只是一个扩展为0的预处理器宏。